使用 quartz.net,你可以很容易地安排任务在应用程序启动时运行,或者每天、每周、每月的特定时间运行,甚至可以基于更复杂的调度规则。
官网:http://www.quartz-scheduler.net/
实现任务类
创建一个实现了 ijob 接口的类(mailjobtest),该接口包含一个 execute 方法,该方法将在作业运行时调用。例如:
using quartz;
using system;
using system.threading.tasks;
using uploadlogidata.util;
namespace uploadlogidata
{
/// <summary>
/// 邮件任务测试(每天三点固定时间检测logi数据并发送内部邮件)
/// </summary>
//对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
[disallowconcurrentexecution]
public class mailjobtest : ijob
{
public async task execute(ijobexecutioncontext context)
{
try
{
displaylistboxmsg("邮箱开始调度");
} catch (exception ex)
{
uputil.logwrite("exceptionlog",$"定时器异常_{ex.stacktrace}");
}
}
}
}
实现一个logidownloadjob任务类
using mechte_480.datetimecategory;
using quartz;
using system;
using system.threading.tasks;
using uploadlogidata.util;
namespace uploadlogidata.quartzs
{
/// <summary>
/// 监听启动时间,执行任务下载logi数据
/// </summary>
//对于耗时任务,需要上一次执行完成后,才执行下次任务,覆盖之前设置的执行周期
[disallowconcurrentexecution]
public class logidownloadjob : ijob
{
public async task execute(ijobexecutioncontext context)
{
displaylistboxmsg("启动时间开始调度");
}
}
}
启动调度
实例化并启动调度程序,并调度要执行的作业:
ischeduler scheduler1;
/// <summary>
/// 执行任务调度
/// </summary>
/// <returns></returns>
public async task exlogiquartz()
{
displaylistboxmsg("检测任务启动!");
//1、创建一个调度
var factory = new stdschedulerfactory();
var scheduler = await factory.getscheduler();
await scheduler.start();
//2、创建一个任务
var job = jobbuilder.create<logidownloadjob>()
.withidentity("logijob","logigroup")
.build();
//3、创建一个触发器
var trigger = triggerbuilder.create()
.withidentity("logitrigger","logitriggergroup")
.withcronschedule("0/5 * * * * ?") //5秒执行一次
.build();
await scheduler.schedulejob(job,trigger);
// 第二个任务
var job2 = jobbuilder.create<mailjobtest>()
.withidentity("mailjob","mailgroup")
.build();
//3、创建一个触发器
var trigger2 = triggerbuilder.create()
.withidentity("mailtrigger","mailtriggergroup")
.withcronschedule("0/5 * * * * ?") //5秒执行一次
.build();
await scheduler.schedulejob(job2,trigger2);
scheduler1 = scheduler; // 对象赋值
}
为作业指定身份:
var job = jobbuilder.create<simplejob>()
.withidentity("logijob","logigroup") // // 作业名称为 "logijob",组名为 "logigroup"
.build();
为触发器指定身份:
itrigger trigger = triggerbuilder.create()
.withidentity("mytrigger", "mytriggergroup") // 触发器名称为 "mytrigger",组名为 "mytriggergroup"
.startnow()
.withsimpleschedule(x => x.withintervalinhours(1).repeatforever())
.build();
创建第二个任务:
// 创建并调度第二个作业
// 第二个任务
var job2 = jobbuilder.create<mailjobtest>()
.withidentity("mailjob","mailgroup")
.build();
//3、创建一个触发器
var trigger2 = triggerbuilder.create()
.withidentity("mailtrigger","mailtriggergroup")
.withcronschedule("0/5 * * * * ?") //5秒执行一次
.build();
await scheduler.schedulejob(job2,trigger2);
// 可以继续添加更多的作业和触发器...
重要性
- 唯一性:确保每个作业和触发器在调度器中具有唯一的标识,从而避免冲突。
- 组织性:通过组名,可以将相关的作业或触发器组织在一起,便于管理。
- 灵活性:通过使用不同的组,可以轻松地启用、禁用或删除一组相关的作业或触发器。
- 查询和更新:有了明确的身份标识,可以更容易地查询作业或触发器的状态,或者对其进行更新。
取消任务调度
// 关闭 scheduler1.shutdown().wait();
//方法外部访问调度器实例
ischeduler scheduler1;
public async void exquartz()
{
displaylistboxmsg("检测任务启动!");
//1、创建一个调度
var factory = new stdschedulerfactory();
var scheduler = await factory.getscheduler();
await scheduler.start();
//2、创建一个任务
var job = jobbuilder.create<simplejob>()
.withidentity("job1","group1")
.build();
//3、创建一个触发器
var trigger = triggerbuilder.create()
.withidentity("trigger1","group1")
.withcronschedule("0/2 * * * * ?") //5秒执行一次
.build();
await scheduler.schedulejob(job,trigger);
scheduler1 = scheduler; // 对象赋值
}
把exquartz封装到类里面
exlogiquartz方法示例,同时考虑了scheduler的存储和访问:
quartzscheduler类中
using quartz;
using quartz.impl;
using system.threading.tasks;
namespace uploadlogidata.quartzs
{
/// <summary>
/// 封装了exlogiquartz方法和对scheduler的访问
/// </summary>
public class quartzscheduler
{
/// <summary>
/// 方法外部访问调度器实例
/// </summary>
ischeduler logischeduler;
//先静态定义一下主窗体
public static form1 form;
public async task exlogiquartz()
{
form.displaylistboxmsg("检测任务启动!");
// 创建一个调度器实例
var factory = new stdschedulerfactory();
logischeduler = await factory.getscheduler();
await logischeduler.start();
// 创建一个任务:logidownloadjob,每5秒执行一次
var job = jobbuilder.create<logidownloadjob>()
.withidentity("logijob","logigroup")
.build();
var trigger = triggerbuilder.create()
.withidentity("logitrigger","logitriggergroup")
.withcronschedule("0/5 * * * * ?") // 5秒执行一次
.build();
await logischeduler.schedulejob(job,trigger);
// 创建第二个任务:mailjobtest,每天下午3点10分执行一次
var job2 = jobbuilder.create<mailjobtest>()
.withidentity("mailjob","mailgroup")
.build();
var trigger2 = triggerbuilder.create()
.withidentity("mailtrigger","mailtriggergroup")
.withcronschedule("0 10 15 * * ?") // 每天下午3点10分执行一次
.build();
await logischeduler.schedulejob(job2,trigger2);
// 如果需要在其他地方访问scheduler,可以通过类属性或方法获取
}
public ischeduler scheduler => logischeduler;
}
}
调用示例
// 使用示例
public class program
{
public static async task main(string[] args)
{
var quartzscheduler = new quartzscheduler();
await quartzscheduler.exlogiquartz();
// 如果需要在其他地方访问scheduler,可以通过以下方式获取
var scheduler = quartzscheduler.scheduler;
// 如调用关闭
quartzscheduler.scheduler.shutdown().wait();
// 其他逻辑...
}
}
以上就是c#实现quartz任务调度的示例代码的详细内容,更多关于c# quartz任务调度的资料请关注代码网其它相关文章!
发表评论