Add deal function in job scheduler
This commit is contained in:
@@ -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>
|
||||||
@@ -395,6 +396,63 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <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>
|
||||||
/// 获取数据任务
|
/// 获取数据任务
|
||||||
/// </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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
Reference in New Issue
Block a user