Quartz的使用场景:
例如:每5秒对某个平台传输数据
Quartz框架的一些基础概念解释:
Scheduler 作业调度器。
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
TriggerBuilder 根据规则,生产对应的Trigger
这里有个注意点Quartz包的版本必须要2.6.2,因为后面的版本以后也就是3开头的StdSchedulerFactory.GetDefaultScheduler()返回值改了
1.job测试类
/// <summary>
/// 无参作业
/// </summary>
public class Test1Job : IJob
{
public void Execute(IJobExecutionContext context)
{
//写业务代码
Console.WriteLine($"{DateTime.Now}{"无参作业执行!"}");
}
}
public class Test2Job : IJob
{
/// <summary>
/// 有参作业
/// </summary>
/// <param name="context"></param>
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string test = dataMap.GetString("testPara");
Console.WriteLine($"{DateTime.Now}{"有参作业执行,test值:"} {test}");
}
}
2.测试代码
//从工厂中获取一个调度器实例化
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start(); //开启调度器
//第一个例子无参作业创建
//创建一个作业 -WithIdentity的参数(作业名称,做业组)
//当你有不同类型的job时可以将相同类型的job放到一个组里,同一个组里的job可以使用相同的逻辑来处理
IJobDetail job1 = JobBuilder.Create<Test1Job>() //创建一个作业
.WithIdentity("JobName", "group")
.Build();
// Trigger 作为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个Trigger ;
//创建一个触发器 -WithIdentity的参数(触发器名称,触发器组)
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("mytrigger", "group1")
.StartNow() //现在开始
.WithSimpleSchedule(x => x //触发时间,5秒一次。
.WithIntervalInSeconds(5)
.RepeatForever()) //不间断重复执行
.Build();
scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。
//有参作业用传参数UsingJobData
IJobDetail job2 = JobBuilder.Create<Test2Job>()
.WithIdentity("JobName1", "group")
.UsingJobData("testPara", "有参")
.Build();
//WithCronSchedule("") 拥有强大的Cron时间表达式,正常情况下WithSimpleSchedule(x) 已经满足大部分对日期设置的要求了。
// Cron时间表达式 由7段构成:秒 分 时 日 月 星期 年(可选,一般情况下是没有这段)
//https://cron.qqe2.com/ 可以在线生成
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("mytrigger1", "group1")
.StartNow()
.WithCronSchedule("0/5 * * * * ?") //时间表达式,5秒一次
.Build();
scheduler.ScheduleJob(job2, trigger2);
//scheduler.Shutdown(); //关闭调度器。
Console.ReadKey();