From 2f20c028cdf321913d74d4871523829c908c8eff Mon Sep 17 00:00:00 2001 From: luosheng Date: Wed, 22 Feb 2023 11:16:46 +0800 Subject: [PATCH] Add deal function in job scheduler --- .../Modbus.Net/Job/MachineJobScheduler.cs | 99 ++++++++++++++++++- Samples/MachineJob/Worker.cs | 18 +++- Tests/Modbus.Net.PersistedTests/Program.cs | 6 +- 3 files changed, 114 insertions(+), 9 deletions(-) diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs index 4233b32..7881332 100644 --- a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs +++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs @@ -3,6 +3,7 @@ using Quartz.Impl; using Quartz.Impl.Matchers; using System; using System.Collections.Generic; +using System.Reflection.PortableExecutable; using System.Threading.Tasks; namespace Modbus.Net @@ -353,7 +354,7 @@ namespace Modbus.Net /// 写入数据的设备实例 /// /// - public async Task To(string queryId, IMachineMethodData machine) + public async Task To(string queryId, IMachineMethodData machine) { JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); @@ -370,7 +371,7 @@ namespace Modbus.Net await _scheduler.AddJob(job, true); - return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); + return new MachineDealJobScheduler(_scheduler, _trigger, jobKey); } /// @@ -394,6 +395,63 @@ namespace Modbus.Net await _scheduler.Start(); } } + + /// + /// 处理写返回任务 + /// + public sealed class MachineDealJobScheduler + { + private IScheduler _scheduler; + + private ITrigger _trigger; + + private JobKey _parentJobKey; + + /// + /// 处理写返回任务 + /// + /// 调度器 + /// 触发器 + /// 父任务的键 + public MachineDealJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey) + { + _scheduler = scheduler; + + _trigger = trigger; + + _parentJobKey = parentJobKey; + } + + /// + /// 处理写返回 + /// + /// 任务ID,每个触发器唯一 + /// 成功回调方法 + /// 失败回调方法 + /// + /// + public async Task Deal(string queryId = null, Func onSuccess = null, Func onFailure = null) + { + if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, _parentJobKey); + JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); + + IJobDetail job = JobBuilder.Create() + .WithIdentity(jobKey) + .StoreDurably(true) + .Build(); + + job.JobDataMap.Put("OnSuccess", onSuccess); + job.JobDataMap.Put("OnFailure", onFailure); + + var listener = _scheduler.ListenerManager.GetJobListener("Modbus.Net.DataQuery.Chain." + _trigger.Key.Name) as JobChainingJobListenerWithDataMap; + if (listener == null) throw new NullReferenceException("Listener " + "Modbus.Net.DataQuery.Chain." + _trigger.Key.Name + " is null"); + listener.AddJobChainLink(_parentJobKey, jobKey); + + await _scheduler.AddJob(job, true); + + return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); + } + } /// /// 获取数据任务 @@ -458,9 +516,44 @@ namespace Modbus.Net if (valuesSet == null && values != null) valuesSet = ((Dictionary)values).MapGetValuesToSetValues(); - if (valuesSet == null) throw new NullReferenceException("Set value is null"); + if (valuesSet == null) + { + context.JobDetail.JobDataMap.Put("Success", false); + return; + } var success = await (machine as IMachineMethodData)!.SetDatasAsync((MachineDataType)machineDataType, (Dictionary)valuesSet); + context.JobDetail.JobDataMap.Put("Success", success); + } + } + + /// + /// 处理写返回任务 + /// + public class MachineDealDataJob : IJob + { + /// + public async Task Execute(IJobExecutionContext context) + { + object success; + object onSuccess; + object onFailure; + context.JobDetail.JobDataMap.TryGetValue("Success", out success); + context.JobDetail.JobDataMap.TryGetValue("OnSuccess", out onSuccess); + context.JobDetail.JobDataMap.TryGetValue("OnFailure", out onFailure); + bool? successValue = (bool?)success; + if (successValue == true && onSuccess != null) + { + await ((Func)onSuccess)(); + } + if (successValue == false && onFailure != null) + { + await ((Func)onFailure)(); + } + + context.JobDetail.JobDataMap.Remove("Success"); + context.JobDetail.JobDataMap.Remove("OnSuccess"); + context.JobDetail.JobDataMap.Remove("OnFailure"); } } } \ No newline at end of file diff --git a/Samples/MachineJob/Worker.cs b/Samples/MachineJob/Worker.cs index eded1e4..85f528f 100644 --- a/Samples/MachineJob/Worker.cs +++ b/Samples/MachineJob/Worker.cs @@ -28,11 +28,11 @@ namespace MachineJob.Service new AddressUnit() { Area = "4X", Address = 10, DataType = typeof(short), Id = "10", Name = "Test10" } }; - IMachine machine = new ModbusMachine("ModbusMachine1", ModbusType.Tcp, "192.168.0.161", _addresses, true, 1, 2, Endian.BigEndianLsb); + IMachine machine = new ModbusMachine("ModbusMachine1", ModbusType.Tcp, "192.168.0.172", _addresses, true, 1, 2, Endian.BigEndianLsb); //IMachine machine2 = new ModbusMachine("ModbusMachine2", ModbusType.Tcp, "192.168.0.172", _addresses, true, 3, 2, Endian.BigEndianLsb); - await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 5).Result.From(machine.Id, machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Run(); - //await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 5).Result.Apply(machine2.Id + ".Apply", null, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery", QueryConsole2).Result.To(machine2.Id + ".To2", machine2).Result.From(machine2.Id, machine2, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery2", QueryConsole).Result.Run(); + await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 5).Result.From(machine.Id, machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Deal(machine.Id+".Deal", OnSuccess, OnFailure).Result.Run(); + //await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 5).Result.Apply(machine2.Id + ".Apply", null, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery", QueryConsole2).Result.To(machine2.Id + ".To", machine2).Result.Deal(machine.Id + ".Deal", OnSuccess, OnFailure).Result.From(machine2.Id, machine2, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery2", QueryConsole).Result.Run(); } public override async Task StopAsync(CancellationToken cancellationToken) @@ -40,6 +40,18 @@ namespace MachineJob.Service await MachineJobSchedulerCreator.CancelJob("Trigger1"); } + public Task OnSuccess() + { + Console.WriteLine("дɹ"); + return Task.CompletedTask; + } + + public Task OnFailure() + { + Console.WriteLine("дʧ"); + return Task.CompletedTask; + } + private Dictionary QueryConsole(DataReturnDef dataReturnDef) { var values = dataReturnDef.ReturnValues; diff --git a/Tests/Modbus.Net.PersistedTests/Program.cs b/Tests/Modbus.Net.PersistedTests/Program.cs index b622d6b..c3696df 100644 --- a/Tests/Modbus.Net.PersistedTests/Program.cs +++ b/Tests/Modbus.Net.PersistedTests/Program.cs @@ -101,7 +101,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Appl { "4X 3.0", r.Next() % 65536 } -}, MachineDataType.Address).Result.To(machine.Id + ".To", machine).Result.Run(); +}, MachineDataType.Address).Result.To(machine.Id + ".To", machine).Result.Deal().Result.Run(); await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.ApplyTo(machine2.Id + ".Apply", new Dictionary() {{ "4X 1.0", r.Next() % 65536 }, @@ -111,7 +111,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.Appl { "4X 3.0", r.Next() % 65536 } -}, MachineDataType.Address).Result.To(machine2.Id + ".To", machine2).Result.Run(); +}, MachineDataType.Address).Result.To(machine2.Id + ".To", machine2).Result.Deal().Result.Run(); await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.ApplyTo(machine3.Id + ".Apply", new Dictionary() {{ "4X 1.0", r.Next() % 65536 }, @@ -121,5 +121,5 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.Appl { "4X 3.0", r.Next() % 65536 } -}, MachineDataType.Address).Result.To(machine3.Id + ".To", machine3).Result.Run(); +}, MachineDataType.Address).Result.To(machine3.Id + ".To", machine3).Result.Deal().Result.Run(); Console.ReadLine(); \ No newline at end of file