Job repeat immediately after job complete

This commit is contained in:
luosheng
2023-07-15 16:38:23 +08:00
parent d1240e73fb
commit 96a8b21ae4
4 changed files with 88 additions and 12 deletions

View File

@@ -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
{
/// <summary>
/// Repeated JobChaningJobListener
/// </summary>
public class JobChainingJobLIstenerWithDataMapRepeated : JobChainingJobListenerWithDataMap
{
/// <summary>
/// JobChaningJobListener with DataMap passing from parent job to next job
/// </summary>
/// <param name="name">Job name</param>
/// <param name="overwriteKeys">If key is overwritable, parent job will pass the value to next job event next job contains that key</param>
public JobChainingJobLIstenerWithDataMapRepeated(string name, ICollection<string> overwriteKeys) : base(name, overwriteKeys)
{
}
#nullable enable
/// <inheritdoc />
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
}
}

View File

@@ -23,10 +23,13 @@ namespace Modbus.Net
{ {
Name = name; Name = name;
OverWriteKeys = overwriteKeys; OverWriteKeys = overwriteKeys;
chainLinks = new Dictionary<JobKey, JobKey>(); ChainLinks = new Dictionary<JobKey, JobKey>();
} }
private readonly Dictionary<JobKey, JobKey> chainLinks; /// <summary>
/// Job chain links
/// </summary>
protected readonly Dictionary<JobKey, JobKey> ChainLinks;
/// <inheritdoc /> /// <inheritdoc />
public override string Name { get; } public override string Name { get; }
@@ -44,7 +47,7 @@ namespace Modbus.Net
/// <param name="secondJob">a JobKey with the name and group of the follow-up job</param> /// <param name="secondJob">a JobKey with the name and group of the follow-up job</param>
public void AddJobChainLink(JobKey firstJob, JobKey secondJob) public void AddJobChainLink(JobKey firstJob, JobKey secondJob)
{ {
chainLinks.Add(firstJob, secondJob); ChainLinks.Add(firstJob, secondJob);
} }
#nullable enable #nullable enable
@@ -53,7 +56,7 @@ namespace Modbus.Net
JobExecutionException? jobException, JobExecutionException? jobException,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
chainLinks.TryGetValue(context.JobDetail.Key, out var sj); ChainLinks.TryGetValue(context.JobDetail.Key, out var sj);
if (sj == null) if (sj == null)
{ {

View File

@@ -57,7 +57,14 @@ namespace Modbus.Net
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
ITrigger trigger; 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() trigger = TriggerBuilder.Create()
.WithIdentity(triggerKey, "Modbus.Net.DataQuery.Group." + triggerKey) .WithIdentity(triggerKey, "Modbus.Net.DataQuery.Group." + triggerKey)
.StartNow() .StartNow()
@@ -70,7 +77,15 @@ namespace Modbus.Net
.WithSimpleSchedule(b => b.WithInterval(TimeSpan.FromSeconds(interval)).RepeatForever()) .WithSimpleSchedule(b => b.WithInterval(TimeSpan.FromSeconds(interval)).RepeatForever())
.Build(); .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<JobKey>.GroupEquals("Modbus.Net.DataQuery.Group." + triggerKey)); scheduler.ListenerManager.AddJobListener(listener, GroupMatcher<JobKey>.GroupEquals("Modbus.Net.DataQuery.Group." + triggerKey));
if (await scheduler.GetTrigger(new TriggerKey(triggerKey)) != null) if (await scheduler.GetTrigger(new TriggerKey(triggerKey)) != null)
@@ -344,9 +359,9 @@ namespace Modbus.Net
/// 执行任务 /// 执行任务
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task Run() public Task Run()
{ {
await _scheduler.Start(); return _scheduler.Start();
} }
} }

View File

@@ -13,7 +13,7 @@ namespace MachineJob.Service
_logger = logger; _logger = logger;
} }
protected override Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
//1. 直接Coding //1. 直接Coding
//List<AddressUnit> _addresses = new List<AddressUnit> //List<AddressUnit> _addresses = new List<AddressUnit>
@@ -61,10 +61,18 @@ namespace MachineJob.Service
//} //}
//4. 使用MultipleMachinesJobScheduler //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(); var scheduler = await MachineJobSchedulerCreator<IMachineMethodDatas, string, double>.CreateScheduler(machine.Id, 0, 0);
}, -1, 10)); 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) public override Task StopAsync(CancellationToken cancellationToken)