From 96a8b21ae4d349aef791e6d4f638da537d69f46b Mon Sep 17 00:00:00 2001 From: luosheng Date: Sat, 15 Jul 2023 16:38:23 +0800 Subject: [PATCH] Job repeat immediately after job complete --- ...bChainingJobLIstenerWithDataMapRepeated.cs | 50 +++++++++++++++++++ .../Job/JobChainingJobListenerWithDataMap.cs | 11 ++-- .../Modbus.Net/Job/MachineJobScheduler.cs | 23 +++++++-- Samples/MachineJob/Worker.cs | 16 ++++-- 4 files changed, 88 insertions(+), 12 deletions(-) create mode 100644 Modbus.Net/Modbus.Net/Job/JobChainingJobLIstenerWithDataMapRepeated.cs diff --git a/Modbus.Net/Modbus.Net/Job/JobChainingJobLIstenerWithDataMapRepeated.cs b/Modbus.Net/Modbus.Net/Job/JobChainingJobLIstenerWithDataMapRepeated.cs new file mode 100644 index 0000000..45833de --- /dev/null +++ b/Modbus.Net/Modbus.Net/Job/JobChainingJobLIstenerWithDataMapRepeated.cs @@ -0,0 +1,50 @@ +using Quartz; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Modbus.Net +{ + /// + /// Repeated JobChaningJobListener + /// + public class JobChainingJobLIstenerWithDataMapRepeated : JobChainingJobListenerWithDataMap + { + /// + /// JobChaningJobListener with DataMap passing from parent job to next job + /// + /// Job name + /// If key is overwritable, parent job will pass the value to next job event next job contains that key + public JobChainingJobLIstenerWithDataMapRepeated(string name, ICollection overwriteKeys) : base(name, overwriteKeys) + { + } + +#nullable enable + /// + public override async Task JobWasExecuted(IJobExecutionContext context, + JobExecutionException? jobException, + CancellationToken cancellationToken = default) + { + await base.JobWasExecuted(context, jobException, cancellationToken); + ChainLinks.TryGetValue(context.JobDetail.Key, out var sj); + if (sj == null) + { + var chainRoot = context.JobDetail.Key; + var chainParent = ChainLinks.FirstOrDefault(p => p.Value == context.JobDetail.Key).Key; + while (chainParent != null) + { + chainRoot = chainParent; + chainParent = ChainLinks.FirstOrDefault(p => p.Value == chainParent).Key; + } + + var sjJobDetail = await context.Scheduler.GetJobDetail(chainRoot); + await context.Scheduler.AddJob(sjJobDetail!, true, false); + await context.Scheduler.TriggerJob(chainRoot, cancellationToken).ConfigureAwait(false); + } + } +#nullable disable + } +} diff --git a/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs b/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs index d25a122..edf8ed1 100644 --- a/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs +++ b/Modbus.Net/Modbus.Net/Job/JobChainingJobListenerWithDataMap.cs @@ -23,10 +23,13 @@ namespace Modbus.Net { Name = name; OverWriteKeys = overwriteKeys; - chainLinks = new Dictionary(); + ChainLinks = new Dictionary(); } - private readonly Dictionary chainLinks; + /// + /// Job chain links + /// + protected readonly Dictionary ChainLinks; /// public override string Name { get; } @@ -44,7 +47,7 @@ namespace Modbus.Net /// a JobKey with the name and group of the follow-up job public void AddJobChainLink(JobKey firstJob, JobKey secondJob) { - chainLinks.Add(firstJob, secondJob); + ChainLinks.Add(firstJob, secondJob); } #nullable enable @@ -53,7 +56,7 @@ namespace Modbus.Net JobExecutionException? jobException, CancellationToken cancellationToken = default) { - chainLinks.TryGetValue(context.JobDetail.Key, out var sj); + ChainLinks.TryGetValue(context.JobDetail.Key, out var sj); if (sj == null) { diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs index cfc366b..30ad145 100644 --- a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs +++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs @@ -57,7 +57,14 @@ namespace Modbus.Net IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); ITrigger trigger; - if (count >= 0) + if (interval <= 0) + { + trigger = TriggerBuilder.Create() + .WithIdentity(triggerKey, "Modbus.Net.DataQuery.Group." + triggerKey) + .StartNow() + .Build(); + } + else if (count >= 0) trigger = TriggerBuilder.Create() .WithIdentity(triggerKey, "Modbus.Net.DataQuery.Group." + triggerKey) .StartNow() @@ -70,7 +77,15 @@ namespace Modbus.Net .WithSimpleSchedule(b => b.WithInterval(TimeSpan.FromSeconds(interval)).RepeatForever()) .Build(); - var listener = new JobChainingJobListenerWithDataMap("Modbus.Net.DataQuery.Chain." + triggerKey, new string[2] { "Value", "SetValue" }); + IJobListener listener; + if (interval <= 0) + { + listener = new JobChainingJobLIstenerWithDataMapRepeated("Modbus.Net.DataQuery.Chain." + triggerKey, new string[2] { "Value", "SetValue" }); + } + else + { + listener = new JobChainingJobListenerWithDataMap("Modbus.Net.DataQuery.Chain." + triggerKey, new string[2] { "Value", "SetValue" }); + } scheduler.ListenerManager.AddJobListener(listener, GroupMatcher.GroupEquals("Modbus.Net.DataQuery.Group." + triggerKey)); if (await scheduler.GetTrigger(new TriggerKey(triggerKey)) != null) @@ -344,9 +359,9 @@ namespace Modbus.Net /// 执行任务 /// /// - public async Task Run() + public Task Run() { - await _scheduler.Start(); + return _scheduler.Start(); } } diff --git a/Samples/MachineJob/Worker.cs b/Samples/MachineJob/Worker.cs index e97f132..9009b17 100644 --- a/Samples/MachineJob/Worker.cs +++ b/Samples/MachineJob/Worker.cs @@ -13,7 +13,7 @@ namespace MachineJob.Service _logger = logger; } - protected override Task ExecuteAsync(CancellationToken stoppingToken) + protected override async Task ExecuteAsync(CancellationToken stoppingToken) { //1. Ö±½ÓCoding //List _addresses = new List @@ -61,10 +61,18 @@ namespace MachineJob.Service //} //4. ʹÓÃMultipleMachinesJobScheduler - return Task.Run(() => MultipleMachinesJobScheduler.RunScheduler(machines, async (machine, scheduler) => + //return Task.Run(() => MultipleMachinesJobScheduler.RunScheduler(machines, async (machine, scheduler) => + //{ + // /await scheduler.From(machine.Id + ".From", machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Deal(machine.Id + ".Deal", OnSuccess, OnFailure).Result.Run(); + //}, -1, 10)); + + //5. ²»ÉèÖù̶¨Ê±¼ä£¬Á¬Ðø´¥·¢Job + foreach (var machine in machines) { - await scheduler.From(machine.Id + ".From", machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Deal(machine.Id + ".Deal", OnSuccess, OnFailure).Result.Run(); - }, -1, 10)); + var scheduler = await MachineJobSchedulerCreator.CreateScheduler(machine.Id, 0, 0); + var job = scheduler.From(machine.Id + ".From", machine, MachineDataType.Name).Result.Query(machine.Id + ".ConsoleQuery", QueryConsole).Result.To(machine.Id + ".To", machine).Result.Deal(machine.Id + ".Deal", OnSuccess, OnFailure).Result; + await job.Run(); + } } public override Task StopAsync(CancellationToken cancellationToken)