Java定时任务调度工具详解Quartz(一)
基础知识:
一:Quartz具有的特点:
(1)具有强大的调度功能,很容易与spring集成,形成灵活可配置的调度功能。
(2)调度环境的持久化机制:可以保存并恢复调度现场,即使系统因为故障关闭,任务调度现场的数据并不会丢失;timer没有这些特点。
(3)灵活的应用方式:可以灵活的定义触发器调度的时间表,并可以对触发器与任务进行关联映射;
(4)分布式与集群能力。
二:设计模式
设计模式:Builder模式、Factory模式、组件模式、链式写法
核心概念:调度器(Scheduler)、任务(Job)、触发器(Trigger)
(1)Job
实质:是一个接口,里面有一个execute方法,用于编写任务业务逻辑
生命周期:当调度器需要执行job时创建实例,调用完成后释放job实例
(2)JobDetail
概念:描述Job实例的详细信息
属性:
(1)name:job名称
(2)group:job组,默认值为default
(3)jobclass:job实现类
(4)jobDataMap:存储Job实例的状态信息,调度器使用这些信息添加Job实例
(3)JobExecutionContext
概念:Job能通过JobExecutionContext访问Quartz运行环境以及Job的明细数据,当Scheduler调用Job时能将数据传递给execute()方法
(4)JobDataMap
概念:是一个JDK中Map接口实例,在任务调度时存在于JobExecutionContext中,可将参数对象传递给在运行的Job实例;而且,它自身有方便的方法可存取基本数据类型
获取方式:从JobDataMap中直接获取、在Job实现类中添加setter方法对应JobDataMap的键值
(5)Trigger属性:
(1)Jobkey:Job实例标识,触发器被触发时,job实例随之执行
(2)startTime:首次被触发时间
(3)endTime:不再被触发的时间
(6)SimpleTrigger
概念:在指定时间段内只执行一次任务或者在指定时间间隔内多次执行任务
(7)CronTrigger(更常用,可以代替SimpleTrigger)
概念:基于日历的作业调度器,指定哪一个月哪一天什么时间执行
使用Corn表达式 可以根据日历 来指定执行时间。
Cron表达式:
用于配置CronTrigger实例,是由7个子表达式组成的字符串,描述了时间表的详细信息,格式:[秒] [分] [小时] [日] [月] [周] [年]
说明:(1)第二个例子中,0/5是指每隔5分钟触发
(2)第四个例子中,6#3是指第三周的星期五(6表示星期五,因为国外每周是从星期日开始)
(3)第五个例子中,6L是指最后一周的星期五(6表示星期五,因为国外每周是从星期日开始)
补充:如何定义每月最后一个工作日呢?
答案:0 0 0 LW * ?
也可以使用“在线Cron表达式生成器”,进行生成表达式
注意:job 和 Trigger 是一对多的关系
其中:
(1)scheduleJob(JobDetail jobDetail,Trigger trigger)是指返回最近一次执行的时间
(2)standby()表示暂时将scheduler挂起,可以后期再次开启,即调用start()进行开启。
(3)shutdown 的用法:关闭scheduler调度器,后期不可以被重启。
shutdown(true)表示等待所有正在执行的job执行完毕之后,再关闭scheduler
shutdown(false)即shutdown()表示直接关闭scheduler
三:quartz.properties配置文件的引入:
首先quartz.jar包的org.quartz目录下有一个默认的quartz.properties,如果当前项目下没有创建quartz.properties文件,系统会默认执行quartz.jar包下的该配置文件。而且,当前项目下的quartz.properties文件优先于quartz.jar包下的quartz.properties文件。
如何测试呢?
方案:可以任意修改项目下创建的quartz.properties文件内容,不符合要求的就会有报错信息。
关于代码的详细信息,请见下一章节(Java定时任务调度工具详解Quartz(二))