namespace IStation.DataDockingSocket
{
///
/// Modbus辅助类
///
public class SendInstructionJobHelper
{
private static IScheduler _sched;//调度器
///
/// 开始任务
///
public static async void StartJob(Yw.Model.IMonitorDataDockingSession session, InstructionItem item)
{
if (session == null)
return;
if (!session.IsConnected)
return;
if (item == null)
return;
if (string.IsNullOrEmpty(item.Instruction))
return;
if (item.RuleItems == null || item.RuleItems.Count < 1)
return;
LogHelper.Info($"{session.SessionName} 开始处理发送指令任务,指令:{item.Instruction} !");
var jobName = SendInstructionJobNameHelper.GetJobName(session, item.Instruction);
var jobGroupName = SendInstructionJobNameHelper.GetJobGroupName(session, item.Instruction);
var triggerName = SendInstructionJobNameHelper.GetTriggerName(session, item.Instruction);
//判断是否存在
if (_sched != null)
{
var triggerKey = new TriggerKey(triggerName, jobGroupName);
if (await _sched.CheckExists(triggerKey))
{
LogHelper.Info($"{session.SessionName} 中,指令:{item.Instruction} 的主动请求数据任务已经开启,无需重复开启!");
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.Instruction));
//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.Instruction);
LogHelper.Info($"{session.SessionName} 中,指令:{item.Instruction} 的主动请求数据线程开启成功!");
}
///
/// 取消任务
///
private static async void CancelJob(Yw.Model.IMonitorDataDockingSession session, string instruction)
{
if (_sched == null)
return;
LogHelper.Info($"{session.SessionName} 正打算终止主动请求数据任务");
var triggerName = SendInstructionJobNameHelper.GetTriggerName(session, instruction);
var jobGroupName = SendInstructionJobNameHelper.GetJobGroupName(session, instruction);
var triggerKey = new TriggerKey(triggerName, jobGroupName);
if (await _sched.CheckExists(triggerKey))
{
await _sched.UnscheduleJob(triggerKey);
LogHelper.Info($"{session.SessionName},指令:{instruction} 主动请求数据任务终止成功");
}
else
{
LogHelper.Info($"{session.SessionName},指令:{instruction} 主动请求数据任务不存在");
}
}
}
}