using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using IStation.Untity; namespace IStation.DataDockingSocket { /// /// Modbus辅助类 /// public class SendInstructionJobHelper { private static IScheduler _sched;//调度器 /// /// 开始任务 /// public static async void StartJob(Model.IMonitorDataDockingSession session, QueryInstructionItem item) { if (session == null) return; if (!session.IsConnected) return; if (item == null) return; if (string.IsNullOrEmpty(item.Content)) return; NtLogHelper.Info($"{session.SessionName} 开始处理发送指令任务,指令:{item.Content} !"); var jobName = SendInstructionJobNameHelper.GetJobName(session, item.Name); var jobGroupName = SendInstructionJobNameHelper.GetJobGroupName(session, item.Name); var triggerName = SendInstructionJobNameHelper.GetTriggerName(session, item.Name); //判断是否存在 if (_sched != null) { var triggerKey = new TriggerKey(triggerName, jobGroupName); if (await _sched.CheckExists(triggerKey)) { NtLogHelper.Info($"{session.SessionName} 中,指令:{item.Content} 的主动请求数据任务已经开启,无需重复开启!"); return; } } //判断是否开启调取器 if (_sched == null) { // 1.创建scheduler的引用 var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.启动 scheduler await _sched.Start(); } //3.创建任务 var job = JobBuilder.Create() .WithIdentity(jobName, jobGroupName) .Build(); job.JobDataMap.Put(SendInstructionJob.Session, session); job.JobDataMap.Put(SendInstructionJob.Instruction, BitTransfer.FromString(item.Content)); //4.创建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(triggerName, jobGroupName) .WithSimpleSchedule(x => x.WithIntervalInSeconds(item.Frequency).RepeatForever() .WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.加入调度管理器 await _sched.ScheduleJob(job, trigger); session.SessionClosedEvent += () => CancelJob(session, item); NtLogHelper.Info($"{session.SessionName} 中,指令:{item.Content} 的主动请求数据线程开启成功!"); } /// /// 取消任务 /// private static async void CancelJob(Model.IMonitorDataDockingSession session, QueryInstructionItem item) { if (_sched == null) return; NtLogHelper.Info($"{session.SessionName} 正打算终止主动请求数据任务"); var triggerName = SendInstructionJobNameHelper.GetTriggerName(session, item.Name); var jobGroupName = SendInstructionJobNameHelper.GetJobGroupName(session, item.Name); var triggerKey = new TriggerKey(triggerName, jobGroupName); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); NtLogHelper.Info($"{session.SessionName},指令:{item.Name} 主动请求数据任务终止成功"); } else { NtLogHelper.Info($"{session.SessionName},指令:{item.Name} 主动请求数据任务不存在"); } } } }