Quartz.NET 调度公共类
<h3>一、使用方法</h3>
<ol>
<li>
<p>安装Quartz包
PM> Install-Package Quartz -Version 2.6.2</p>
</li>
<li>构建执行任务
<pre><code class="language-csharp">public class TaskReadData : IJob
{
public void Execute(IJobExecutionContext context)
{
//将要定时执行的逻辑代码写于此处
Console.WriteLine(DateTime.Now.ToString() + "\t工作太久了,休息一下吧。\n");
}
}</code></pre></li>
<li>调用示例</li>
</ol>
<pre><code class="language-csharp">var task = new QuartzTask();
// 每小时重新连接一次 PLC
task.Appand<TaskConnect>(x => x.WithCalendarIntervalSchedule(y => y.WithIntervalInHours(1)));
// 5秒中读取一次数据
task.Appand<TaskReadData>(5, IntervalUnit.Second);
// 1分钟上传一次数据到总服务器
task.Appand<TaskUpData>(1, IntervalUnit.Minute);
// 每分钟上传一次数据
//task.Appand<TaskUpData>(x=>x.WithCronSchedule("0 0/1 * * * ? *"));
task.Start();
bool isStarted = task.Scheduler.IsStarted;
Log.WriteLog("-------------------计划程序已启动-----------------------");</code></pre>
<h3>二、调度公共类</h3>
<pre><code class="language-csharp">#region Information
/*
* =================================================================
* Copyright(c) 2018 *****,All Rights Reserved.
* Author: hunter
* Date: 2018/10/24 20:23:09
* Version: 1.0.0
* =================================================================
*/
#endregion
using Quartz;
using Quartz.Impl;
using System;
namespace AcquisitionSystem.Code.Quartz
{
/// <summary>
/// 提供一个调度作业工具,不能被继承。
/// </summary>
public sealed class QuartzTask
{
/// <summary>
/// 定义调度器。
/// </summary>
public IScheduler Scheduler { get; set; }
/// <summary>
/// 创建调度器。
/// </summary>
public QuartzTask()
{
/*
* 通过 StdSchedulerFactory 获取到调度工厂 ISchedulerFactory,
* 通过调度工厂的 GetScheduler 方法获取到一个调度器 scheduler 。
* 初始化调度器 scheduler 之后, 就可以启动、 备用、 关闭。
*/
ISchedulerFactory sf = new StdSchedulerFactory();
// IScheduler:调度器交互的主要接口。
Scheduler = sf.GetScheduler();
}
/// <summary>
/// 启动调度器。
/// </summary>
public void Start()
{
Scheduler.Start();
}
/// <summary>
/// 停止调度器。
/// </summary>
public void Stop()
{
Scheduler.Shutdown();
}
/// <summary>
/// 将作业追加到调度器中。
/// </summary>
/// <typeparam name="T"> 需要追加的作业类。</typeparam>
/// <param name="triggerDdefine"> 自定义设置 TriggerBuilder 相关属性。 </param>
public void Appand<T>(Action<TriggerBuilder> triggerDdefine) where T : IJob
{
var jobDetail = CreateJobDetail<T>();
var trigger = CreateTrigger(triggerDdefine);
Scheduler.ScheduleJob(jobDetail, trigger);
}
/// <summary>
/// 将作业追加到调度器中。
/// </summary>
/// <typeparam name="T"> 需要追加的作业类。</typeparam>
/// <param name="interval"> 重复的间隔时间。</param>
/// <param name="unit"> 时间间隔单位。</param>
public void Appand<T>(int interval, IntervalUnit unit) where T : IJob
{
var jobDetail = CreateJobDetail<T>();
var trigger = CreateTrigger(interval, unit);
Scheduler.ScheduleJob(jobDetail, trigger);
}
/// <summary>
/// 将作业追加到调度器中。
/// </summary>
/// <typeparam name="T"> 需要追加的作业类。</typeparam>
/// <param name="hour"> 每天的时间 0 到 23 之间。</param>
/// <param name="minute"> 每天的时间 0 到 59 之间。</param>
/// <param name="second"> 每天的时间 0 到 59 之间。</param>
public void Appand<T>(int hour, int minute, int second) where T : IJob
{
var jobDetail = CreateJobDetail<T>();
var trigger = CreateTrigger(hour, minute, second);
Scheduler.ScheduleJob(jobDetail, trigger);
}
/// <summary>
/// 创建作业。
/// </summary>
/// <typeparam name="T"> 需要创建的作业类。</typeparam>
/// <returns> 返回创建成功的具体作业。</returns>
private static IJobDetail CreateJobDetail<T>() where T : IJob
{
/*
* JobBuilder:定义 JobDetail 实例
* IJobDetail:定义 Job 实例及其它相关的静态信息
*/
return JobBuilder.Create<T>().Build();
}
/// <summary>
/// 创建触发器 。
/// </summary>
/// <param name="triggerDefine"> 自定义设置 TriggerBuilder 相关属性。</param>
private static ITrigger CreateTrigger(Action<TriggerBuilder> triggerDefine)
{
//创建触发器实例。
var trigger = TriggerBuilder.Create();
if (triggerDefine != null)
triggerDefine(trigger);
return trigger.Build();
}
/// <summary>
/// 创建触发器 。
/// </summary>
/// <param name="interval"> 重复的间隔时间。</param>
/// <param name="unit"> 时间间隔单位。</param>
private static ITrigger CreateTrigger(int interval, IntervalUnit unit)
{
// 创建触发器实例。
var trigger = TriggerBuilder.Create()
.WithCalendarIntervalSchedule(x => x.WithInterval(interval, unit))
.Build();
return trigger;
}
/// <summary>
/// 创建触发器 。
/// </summary>
/// <param name="hour"> 每天的时间 0 到 23 之间。</param>
/// <param name="minute"> 每天的时间 0 到 59 之间。</param>
/// <param name="second"> 每天的时间 0 到 59 之间。</param>
private static ITrigger CreateTrigger(int hour, int minute, int second)
{
// 创建触发器实例。
var trigger = TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule(
x => x.StartingDailyAt(TimeOfDay.HourMinuteAndSecondOfDay(hour, minute, second)).WithRepeatCount(1)
)
.Build();
return trigger;
}
}
}</code></pre>