Add deal function in job scheduler

This commit is contained in:
luosheng
2023-02-22 11:16:46 +08:00
parent 70b54adf80
commit 2f20c028cd
3 changed files with 114 additions and 9 deletions

View File

@@ -3,6 +3,7 @@ using Quartz.Impl;
using Quartz.Impl.Matchers; using Quartz.Impl.Matchers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection.PortableExecutable;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Modbus.Net namespace Modbus.Net
@@ -353,7 +354,7 @@ namespace Modbus.Net
/// <param name="machine">写入数据的设备实例</param> /// <param name="machine">写入数据的设备实例</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="NullReferenceException"></exception> /// <exception cref="NullReferenceException"></exception>
public async Task<MachineSetJobScheduler> To(string queryId, IMachineMethodData machine) public async Task<MachineDealJobScheduler> To(string queryId, IMachineMethodData machine)
{ {
JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); 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); await _scheduler.AddJob(job, true);
return new MachineSetJobScheduler(_scheduler, _trigger, jobKey); return new MachineDealJobScheduler(_scheduler, _trigger, jobKey);
} }
/// <summary> /// <summary>
@@ -394,6 +395,63 @@ namespace Modbus.Net
await _scheduler.Start(); await _scheduler.Start();
} }
} }
/// <summary>
/// 处理写返回任务
/// </summary>
public sealed class MachineDealJobScheduler
{
private IScheduler _scheduler;
private ITrigger _trigger;
private JobKey _parentJobKey;
/// <summary>
/// 处理写返回任务
/// </summary>
/// <param name="scheduler">调度器</param>
/// <param name="trigger">触发器</param>
/// <param name="parentJobKey">父任务的键</param>
public MachineDealJobScheduler(IScheduler scheduler, ITrigger trigger, JobKey parentJobKey)
{
_scheduler = scheduler;
_trigger = trigger;
_parentJobKey = parentJobKey;
}
/// <summary>
/// 处理写返回
/// </summary>
/// <param name="queryId">任务ID每个触发器唯一</param>
/// <param name="onSuccess">成功回调方法</param>
/// <param name="onFailure">失败回调方法</param>
/// <returns></returns>
/// <exception cref="NullReferenceException"></exception>
public async Task<MachineSetJobScheduler> Deal(string queryId = null, Func<Task> onSuccess = null, Func<Task> 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<MachineDealDataJob>()
.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);
}
}
/// <summary> /// <summary>
/// 获取数据任务 /// 获取数据任务
@@ -458,9 +516,44 @@ namespace Modbus.Net
if (valuesSet == null && values != null) if (valuesSet == null && values != null)
valuesSet = ((Dictionary<string, ReturnUnit>)values).MapGetValuesToSetValues(); valuesSet = ((Dictionary<string, ReturnUnit>)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<string, double>)valuesSet); var success = await (machine as IMachineMethodData)!.SetDatasAsync((MachineDataType)machineDataType, (Dictionary<string, double>)valuesSet);
context.JobDetail.JobDataMap.Put("Success", success);
}
}
/// <summary>
/// 处理写返回任务
/// </summary>
public class MachineDealDataJob : IJob
{
/// <inheritdoc />
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<Task>)onSuccess)();
}
if (successValue == false && onFailure != null)
{
await ((Func<Task>)onFailure)();
}
context.JobDetail.JobDataMap.Remove("Success");
context.JobDetail.JobDataMap.Remove("OnSuccess");
context.JobDetail.JobDataMap.Remove("OnFailure");
} }
} }
} }

View File

@@ -28,11 +28,11 @@ namespace MachineJob.Service
new AddressUnit() { Area = "4X", Address = 10, DataType = typeof(short), Id = "10", Name = "Test10" } new AddressUnit() { Area = "4X", Address = 10, DataType = typeof(short), Id = "10", Name = "Test10" }
}; };
IMachine<string> machine = new ModbusMachine<string, string>("ModbusMachine1", ModbusType.Tcp, "192.168.0.161", _addresses, true, 1, 2, Endian.BigEndianLsb); IMachine<string> machine = new ModbusMachine<string, string>("ModbusMachine1", ModbusType.Tcp, "192.168.0.172", _addresses, true, 1, 2, Endian.BigEndianLsb);
//IMachine<string> machine2 = new ModbusMachine<string, string>("ModbusMachine2", ModbusType.Tcp, "192.168.0.172", _addresses, true, 3, 2, Endian.BigEndianLsb); //IMachine<string> machine2 = new ModbusMachine<string, string>("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("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 + ".To2", machine2).Result.From(machine2.Id, machine2, MachineDataType.Name).Result.Query(machine2.Id + ".ConsoleQuery2", QueryConsole).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) public override async Task StopAsync(CancellationToken cancellationToken)
@@ -40,6 +40,18 @@ namespace MachineJob.Service
await MachineJobSchedulerCreator.CancelJob("Trigger1"); await MachineJobSchedulerCreator.CancelJob("Trigger1");
} }
public Task OnSuccess()
{
Console.WriteLine("дÈÎÎñ³É¹¦");
return Task.CompletedTask;
}
public Task OnFailure()
{
Console.WriteLine("дÈÎÎñʧ°Ü");
return Task.CompletedTask;
}
private Dictionary<string, double> QueryConsole(DataReturnDef dataReturnDef) private Dictionary<string, double> QueryConsole(DataReturnDef dataReturnDef)
{ {
var values = dataReturnDef.ReturnValues; var values = dataReturnDef.ReturnValues;

View File

@@ -101,7 +101,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 10).Result.Appl
{ {
"4X 3.0", r.Next() % 65536 "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<string, double>() {{ await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.ApplyTo(machine2.Id + ".Apply", new Dictionary<string, double>() {{
"4X 1.0", r.Next() % 65536 "4X 1.0", r.Next() % 65536
}, },
@@ -111,7 +111,7 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger2", -1, 10).Result.Appl
{ {
"4X 3.0", r.Next() % 65536 "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<string, double>() {{ await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.ApplyTo(machine3.Id + ".Apply", new Dictionary<string, double>() {{
"4X 1.0", r.Next() % 65536 "4X 1.0", r.Next() % 65536
}, },
@@ -121,5 +121,5 @@ await MachineJobSchedulerCreator.CreateScheduler("Trigger3", -1, 10).Result.Appl
{ {
"4X 3.0", r.Next() % 65536 "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(); Console.ReadLine();