Quartz在.NET中的使用
一、背景
例如需要在某年某月去将数据库的某个数据更新或者同步,又或者是每隔一段时间来执行一部分代码去调用接口,但是又不想人为的手动去执行
针对此类业务可以使用"定时调用任务",市面上有很多的定时调度任务框架,甚至你可以使用定时器来结合Windows服务做一个简易版的任务调度程序,此处我们学习Quartz,因为Quartz是一个强大、开源、轻量级的任务调度框架,支持cron-like表达式其他一些优秀的特性。
二、Quartz
1.基本概念
| Scheduler | Trigger | Job |
|---|---|---|
| 调度器,quartz工作时的独立容器 | 触发器,定义了调度任务的时间规则 | 调用任务具体要执行的动作的容器 |
2.初步使用
1.Nuget引入QuartZ程序集
2.创建一个Scheduler任务调度容器
3.指定具体执行的任务Job和触发器
4.把策略和任务放入到Scheduler并启动
public class QuartzManager
{
public async static void Init()
{
StdSchedulerFactory factory = new StdSchedulerFactory();
//创建一个Scheduler任务调度容器
IScheduler scheduler = await factory.GetScheduler();
//指定具体执行的任务Job
IJobDetail sendEmailJob = JobBuilder.Create<SendMailJob>()
.WithIdentity("sendEmailJob", "sendEmailJobGrop")
.WithDescription("定时发送邮件").Build();
//设置触发条件为五秒执行一次
ITrigger sendEmailTrigger = TriggerBuilder.Create()
.WithIdentity("sendEmailTrigger", "sendEmailJobGrop"
.WithDescription("QuartZ")
.WithCronSchedule("3/5 * * * * ?")
.Build();
//把策略和任务放入到Scheduler
await scheduler.ScheduleJob(sendEmailJob, sendEmailTrigger);
//执行任务
await scheduler.Start();
}
}
//增加特性保证任务不会重叠执行
[DisallowConcurrentExecution]
public class SendMailJob : IJob
{
//Job类
public async Task Execute(IJobExecutionContext context)
{
await Task.Run(() =>
{
//doSomthing
Console.WriteLine($"开始发送邮件{DateTime.Now}");
});
}
}
三、传递参数
有时候我们想在Job执行时需要一些参数,并根据这些参数来做一些逻辑处理,这时候就需要使用Quartz传参了。
在Quartz中传参主要有一些几种方式
1.job传参
2.Trigger传参
1.job传参和Trigger传参
使用JobDataMap.Add添加参数,在job内部使用上下文的JobDataMap.GetString获取
IJobDetail sendEmailJob = JobBuilder.Create<SendMailJob>().Build();
//往Job传一个参数
sendEmailJob.JobDataMap.Add("params","job测试传参");
ITrigger trigger = TriggerBuilder.Create().Build();
//往trigger传一个参数
trigger.JobDataMap.Add("params", "trigger测试传参");
//在job中获取参数
public async Task Execute(IJobExecutionContext context)
{
await Task.Run(() =>
{
//获取job传参
string paramJob = context.JobDetail.JobDataMap.GetString("params");
//获取Trigger传参
string paramTrigger = context.Trigger.JobDataMap.GetString("params");
//doSomthing
Console.WriteLine($"开始发送邮件{DateTime.Now}");
});
}
四、在scheduler中注册监听器
监听器是为调度程序中发生的事件执行操作而创建的对象,主要有一下三种监听器
1.调度监听器ISchedulerListener主要用于调度过程的监听。
2.触发器监听器ITriggerListener主要用于接收和触发器相关的事件监听。
3.作业监听器IJobListener用于接收Job运行生命周期相关事件监听。
1.实现监听器
以作业监听器为例,因为触发和调度监听一样的实现。
1.自定义作业监听器需要继承自IJobListener接口并实现方法.
2.在调度器的监听管理中添加自定义监听器.
//实现监听器
public class CustomJobListener : IJobListener
{
public string Name => "CustomJobListener";
}
//添加到监听管理中
scheduler.ListenerManager.AddJobListener(new CustomJobListener());
五、可视化管理界面
用于可视化工具来查看当前运行Job的信息。
1.需要新建一个web项目或者控制台项目。
2.在web项目中 Nuget 引入Quartz 和CrystalQuartz.Remote程序包
3.在Job调度中配置StdSchedulerFactory相关信息指定监听端口
var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "Test Monitor System";
// 设置线程池
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";
// 远程输出配置
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = "8081";
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp";
var schedulerFactory = new StdSchedulerFactory(properties);
IScheduler _scheduler = await schedulerFactory.GetScheduler();
4.web监控端去访问统一的端口号下的CrystalQuartzPanel.axd即可查看。

六、配置文件配置任务
我们除了在代码中定义任务的各种调度和触发器之外,还可以使用xml配置文件的方式来创建Job任务
1.准备配置文件,配置Job+trigger相关信息,一定要将此文件属性设为"始终复制"
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>
<schedule>
<job>
<name>sendEmailJob</name>
<group>Test Mail Job</group>
<description>This is Test Mail Job</description>
<!--此处为Job所在的类,及程序集-->
<job-type>DispatcherProject.Job.SendMailJob,DispatcherProject</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>sendEmailTrigger</name>
<group>sendEmailJobGrop</group>
<job-name>sendEmailJob</job-name>
<job-group>Test Mail Job</job-group>
<cron-expression>5/3 * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
2.读取配置文件,获取信息,生成对应的Job和Trigger
XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper());
//读取配置文件
await processor.ProcessFileAndScheduleJobs("~/config/quartz.xml", scheduler);
//启动调度任务
await scheduler.Start();
Quartz在.NET中的使用的更多相关文章
- Quartz 在 Spring 中如何动态配置时间--转
原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...
- Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...
- Quartz在Spring中动态设置cronExpression
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...
- quartz的job中注入spring对象!
一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类. 自定义一个类: public ...
- quartz 的job中获取到applicationContext
第一步: 定义SchedulerFactoryBean的applicationContextSchedulerContextKey <bean name="scheduler" ...
- 在quartz的Job中获得Spring的WebApplicationContext或ServletContext
有时候我们需要在web工程中定时器类里面获得spring的IOC容器,即WebApplicationContext,用它来获取实现了某接口的所有的bean,因为@Autowired貌似只能注入单个be ...
- Quartz(自动任务)中的触发器Trigger
1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.qua ...
- 调度器Quartz的配置文件中的线程池设置
在使用调度器Quartz来进行数据归档的时候,当我们开的定时任务很多的时候,就会出现一些定时任务不会被触发的现象,这就是线程阻塞.那到底什么叫线程阻塞呢? 线程阻塞,顾名思义就是说线程被阻塞了,没有按 ...
- Quartz的job中注入的services接口为空的解决办法
自己重新定义一个类继承AdaptableJobFactory类 public class JobFactory extends AdaptableJobFactory { @Autowired pri ...
随机推荐
- C# WINFORM进销存系统开发(内涵免费源码+部分实操视频讲解)
互联网的时代,电商火爆,大家都开始进行线上销售货品,那你是如何管理你的商品库存和进销问题?软积木--小敏用的是C# WINFORM进销存系统来管理我的数据,给我带来了很多便利. 它是高频需求项目,很多 ...
- 编解码再进化:Ali266 与下一代视频技术
过去的一年见证了人类百年不遇的大事记,也见证了多种视频应用的厚积薄发.而因此所带来的视频数据量的爆发式增长更加加剧了对高效编解码这样的底层硬核技术的急迫需求. 新视频编解码标准 VVC 定稿不久之后, ...
- HTTP1.1 Keep-Alive到底算不算长连接?
在基础架构部沉浸了半年,有一些认知刷新想和童靴们交代一下, 不一定全面,仅代表此时的认知, 也欢迎筒靴们提出看法. 本文聊一聊口嗨用语:"长连接.短连接", 文章会按照下面的思维导 ...
- 日记啦QWWQ
随便写写 时间 :2021年11月15日 今天是在博客园创建博客的第一天,彻底放弃在CSDN中的博客,广告实在是太多了,QWQ. 来计科的第一个学期就快要结束了,期间有很多的遗憾,往后加油吧! 没什么 ...
- python实现图像二值化
1.什么是图像二值化 彩色图像: 有blue,green,red三个通道,取值范围均为0-255 灰度图:只有一个通道0-255,所以一共有256种颜色 二值图像:只有两种颜色,黑色和白色,二值化就是 ...
- [JS高程] 字符串模式匹配方法
目录 1. RegExp 对象 2. 字符串模式匹配方法 2.1 match() , search() 2.2 replace() 2.2.1 第二个参数为字符串的应用情况 2.2.2 第二个参数为函 ...
- 面试官问我JVM调优,我忍不住了!
面试官:今天要不来聊聊JVM调优相关的吧? 面试官:你曾经在生产环境下有过调优JVM的经历吗? 候选者:没有 面试官:... 候选者:嗯...是这样的,我们一般优化系统的思路是这样的 候选者:1. 一 ...
- vue-ref指令
$refs是数组
- PIC16 bootloader之UART bootloader
了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). PIC16 bootl ...
- 9.2 k8s结合Jenkins与gitlab实现代码升级与回滚
1.部署Jenkins 1.1 安装jdk # apt 安装jdk11 apt install openjdk-11-jdk # 查看 root@jenkins:~# java -version op ...