一、背景

例如需要在某年某月去将数据库的某个数据更新或者同步,又或者是每隔一段时间来执行一部分代码去调用接口,但是又不想人为的手动去执行

针对此类业务可以使用"定时调用任务",市面上有很多的定时调度任务框架,甚至你可以使用定时器来结合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中的使用的更多相关文章

  1. Quartz 在 Spring 中如何动态配置时间--转

    原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...

  2. Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).      这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...

  3. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  4. quartz的job中注入spring对象!

    一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类. 自定义一个类: public  ...

  5. quartz 的job中获取到applicationContext

    第一步: 定义SchedulerFactoryBean的applicationContextSchedulerContextKey <bean name="scheduler" ...

  6. 在quartz的Job中获得Spring的WebApplicationContext或ServletContext

    有时候我们需要在web工程中定时器类里面获得spring的IOC容器,即WebApplicationContext,用它来获取实现了某接口的所有的bean,因为@Autowired貌似只能注入单个be ...

  7. Quartz(自动任务)中的触发器Trigger

    1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.qua ...

  8. 调度器Quartz的配置文件中的线程池设置

    在使用调度器Quartz来进行数据归档的时候,当我们开的定时任务很多的时候,就会出现一些定时任务不会被触发的现象,这就是线程阻塞.那到底什么叫线程阻塞呢? 线程阻塞,顾名思义就是说线程被阻塞了,没有按 ...

  9. Quartz的job中注入的services接口为空的解决办法

    自己重新定义一个类继承AdaptableJobFactory类 public class JobFactory extends AdaptableJobFactory { @Autowired pri ...

随机推荐

  1. Part 1 to 10 Basic in C#

    Part 1 Introduction The struct of C# program: namespace , class and Main method what is namespace? t ...

  2. 【Mysql】表锁 行锁 记录锁 间隙锁

    Mysql中的锁 基于锁的属性分类:共享锁.排他锁. 基于锁的状态分类:意向共享锁.意向排它锁 根据锁的粒度分类:全局锁.页锁.表级锁.行锁(记录锁.间隙锁.和临键锁),实际上的锁就这些,上面两种分类 ...

  3. java 获得 微信 UserId

    .... public String cs() throws Exception{ /*访问页面,服务器会得到 code(request.getParameter("code")) ...

  4. Java设计模式之(二)——工厂模式

    1.什么是工厂模式 Define an interface for creating an object,but let subclasses decide which class toinstant ...

  5. myeclipse重写快捷键

    shift+alt+s 点击Override/Implments methods

  6. <C#任务导引教程>练习八

    //66,静态成员与非静态成员的访问方式using System;class Text{    public int x;    public static int y;//静态数据成员    voi ...

  7. [hdu6580]Milk

    考虑定义以下dp数组:1.g1[i][j]表示第i行从中间出发向左取j瓶牛奶最少要多久2.g2[i][j]表示第i行从中间出发向右取j瓶牛奶最少要多久3.g3[i][j]表示在g1[i][j]的基础上 ...

  8. 【HTML】基础

    HTML基础 2019-07-23  10:16:28  by冲冲 在线编辑HTML/CSS/JS效果,实时查看效果 https://c.runoob.com/front-end/61 1. 概念 ① ...

  9. git不显示提交代码

    今天提交代码找不到提交的具体代码,找了好半天,最后发现是右边能下拉能拉下去,尴尬.

  10. RepeatModeler安装及使用

    如果进行重复序列的预测,则使用RepeatModeler,可自身比对进行查找 安装 (1)下载地址:http://www.repeatmasker.org/RepeatModeler/ (2)Repe ...