浅谈Quartz定时任务调度
一 开发概述
对于具有一定规模的大多数企业来说,存在着这样一种需求:存在某个或某些任务,需要系统定期,自动地执行,然而,对大多数企业来说,该技术的实现,却是他们面临的一大难点和挑战。
对于大部分企业来说,实现如上功能,挑战在哪里?
挑战一:如何做一个自动服务的系统?
是从0到1开发(费时费力花钱,还不一定开发成功,即使开发成功,也未必好用),还是购买第三方服务(花钱)。
挑战二:如何实现复杂的“定期规则”?
对于简单的定期规则,可以借助于windows自带的执行计划来执行,但若是复杂的定期规则,windows执行计划未必可行,然而,quartz的cron却很好地解决了该问题,
(可以说,cron在表达时间规则方面,无所不能),除此之外,quartz能很好地配合windows执行计划,实现系统的定期,自动执行任务。
通过如上概述,我们知道quartz能很好地解决该问题,那么,什么是quartz呢?
简言之,quartz就是一种任务调度计划。
- 它是由opensymphony提供的、开源的、java编写的强大任务调度框架
- 几乎可以集成到任何规模的运用程序中,如简单的控制台程序,复杂的大规模分布式电子商务系统
- 可用于创建简单的或复杂的计划任务
- 包含很多企业级功能,如支持jta和集群等
本篇文章,主要从quartz框架核心组件,quartz基本运行原理,quartz核心概念和quartz基本功能实现(代码)等方面来介绍quartz。
二 quartz
当要深入研究一个技术时,研究它的体系结构和内部运行原理,不失为一种较好的方式。同理,我们在研究quartz时,也采用类似的方法,
下图为quartz的大致结构图。
(一)quartz关键组件
quartz比较关键的两个核心组件分别为job和trigger
- job--表示任务是什么
- trigger--表示何时触发任务
(二)quartz几个关键概念
1.ijob
ijob表示一个接口,该接口只有一个方法签名
public interface ijob
{
void execute(jobexecutioncontext context);
}
在quartz中,所有的job任务,必须实现该接口
public class myjob : ijob
{
public void execute(jobexecutioncontext context)
{
console.writeline("quartz基本功能测试。");
}
}
2.jobdetail
jobdetail,顾名思义,就是表示关于每个job的相关信息,它主要包括两个核心组件,即job task和jobdata map
3.trigger
trigger,表示触发器,根据配置规则来触发执行计划调度job,它主要包括两个核心组件,即simpletrigger和crontrigger
4.ijobstore
ijobstore,表述任务存储器,主要存储job和trigger相关信息。
5.ischedulerfactory
ischedulerfactory,表示任务计划工厂,用来管理任务计划ischeduler。
6.ischeduler
ischeduler,表述任务计划,它相当于一个容器,具体job和job相关trigger就能够被注入其中,从而实现任务计划调度。其主要常用的方法:
- start --启动执行计划
- shutdowm --关闭执行计划
接口code:
namespace quartz { public interface ischeduler { bool isstarted { get; } string schedulername { get; } string schedulerinstanceid { get; } bool instandbymode { get; } bool isshutdown { get; } ijobfactory jobfactory { set; } string[] jobgroupnames { get; } string[] triggergroupnames { get; } schedulercontext context { get; } ilist globaljoblisteners { get; } string[] calendarnames { get; } ilist globaltriggerlisteners { get; } iset triggerlistenernames { get; } iset joblistenernames { get; } ilist schedulerlisteners { get; } void addcalendar(string calname, icalendar calendar, bool replace, bool updatetriggers); void addglobaljoblistener(ijoblistener joblistener); void addglobaltriggerlistener(itriggerlistener triggerlistener); void addjob(jobdetail jobdetail, bool replace); void addjoblistener(ijoblistener joblistener); void addschedulerlistener(ischedulerlistener schedulerlistener); void addtriggerlistener(itriggerlistener triggerlistener); bool deletecalendar(string calname); bool deletejob(string jobname, string groupname); icalendar getcalendar(string calname); string[] getcalendarnames(); ilist getcurrentlyexecutingjobs(); ijoblistener getglobaljoblistener(string name); itriggerlistener getglobaltriggerlistener(string name); jobdetail getjobdetail(string jobname, string jobgroup); ijoblistener getjoblistener(string name); string[] getjobnames(string groupname); schedulermetadata getmetadata(); iset getpausedtriggergroups(); trigger gettrigger(string triggername, string triggergroup); itriggerlistener gettriggerlistener(string name); string[] gettriggernames(string groupname); trigger[] gettriggersofjob(string jobname, string groupname); triggerstate gettriggerstate(string triggername, string triggergroup); bool interrupt(string jobname, string groupname); bool isjobgrouppaused(string groupname); bool istriggergrouppaused(string groupname); void pauseall(); void pausejob(string jobname, string groupname); void pausejobgroup(string groupname); void pausetrigger(string triggername, string groupname); void pausetriggergroup(string groupname); bool removeglobaljoblistener(ijoblistener joblistener); bool removeglobaljoblistener(string name); bool removeglobaltriggerlistener(itriggerlistener triggerlistener); bool removeglobaltriggerlistener(string name); bool removejoblistener(string name); bool removeschedulerlistener(ischedulerlistener schedulerlistener); bool removetriggerlistener(string name); datetime? reschedulejob(string triggername, string groupname, trigger newtrigger); void resumeall(); void resumejob(string jobname, string groupname); void resumejobgroup(string groupname); void resumetrigger(string triggername, string groupname); void resumetriggergroup(string groupname); datetime schedulejob(trigger trigger); datetime schedulejob(jobdetail jobdetail, trigger trigger); void shutdown(bool waitforjobstocomplete); void shutdown(); void standby(); void start(); void startdelayed(timespan delay); void triggerjob(string jobname, string groupname); void triggerjob(string jobname, string groupname, jobdatamap data); void triggerjobwithvolatiletrigger(string jobname, string groupname); void triggerjobwithvolatiletrigger(string jobname, string groupname, jobdatamap data); bool unschedulejob(string triggername, string groupname); } }
(三)核心uml图
1.命名空间
不同版本的quartz命名空间有所区别,但差别不大,如下为版本1.0.3命名空间
using quartz;
using quartz.core;
using quartz.impl;
using quartz.impl.adojobstore;
using quartz.impl.adojobstore.common;
using quartz.impl.calendar;
using quartz.impl.matchers;
using quartz.impl.triggers;
using quartz.listener;
using quartz.logging;
using quartz.logging.logproviders;
using quartz.simpl;
using quartz.spi;
using quartz.util;
using quartz.xml;
using quartz.xml.jobschedulingdata20;
using system;
2.关键组件继承关系
在quartz中,许多组件是可以通过配置来促使作业执行的,如线程程序(tread procedure)决定如何执行计划任务线程(quartz scheduler thread)
三 代码
本示例,我们将使用.net 控制台程序,基于vs2017来使用quartz建立一个任务:
任务要求:要求在控制台每隔2秒输出:quartz基本功能测试。
1.首先使用nuget下载quartz
本示例使用的quartz版本为1.0.3
2.按照如下步骤操作
代码:
第一阶段:创建实现ijob接口的myjob类
public class myjob : ijob
{
public void execute(jobexecutioncontext context)
{
console.writeline("quartz基本功能测试。");
}
}
第二阶段:按规则调用quartz组件
static void main(string[] args)
{
//每个2秒执行一次
string cronparam = "*/2 * * * * ?";
//创建计划任务抽象工厂
ischedulerfactory sf = new stdschedulerfactory();
//创建计划任务
ischeduler sched = sf.getscheduler();
//创建job
jobdetail job = new jobdetail("myjob","group", typeof(myjob));
//创建触发器
trigger trigger = new crontrigger("mytrigger","group",cronparam);
//将job和trigger注入到计划任务中
sched.schedulejob(job, trigger);
//启动计划任务
sched.start();
//关闭计划任务
//sched.shutdown();
console.read();
}
3.测试结果
四 参考文献
【01】http://www.quartz-scheduler.org/
【02】https://www.ibm.com/developerworks/library/j-quartz/index.html
【03】https://www.w3cschool.cn/quartz_doc/
五 版权区
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。
- 可以转载该博客,但必须著名博客来源。
上一篇: Eclipse CDT环境下编写、调试、运行C++程序详谈
下一篇: C++奥赛题之大象喝水问题