项目中Quartz定时器的使用
在日常生活中,我们难免会在一些地方使用到一些定时提醒任务,定时的业务逻辑操作。下面我给大家介绍一下简单思路
Quartz 是
一个开源的任务调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。
使用步骤:
1、需要定时执行的任务:
public class QuartzSrvBean { private Logger logger = LoggerFactory.getLogger(QuartzSrvBean.class); private PreOrderMonitorService preOrderMonitorService; public void setPreOrderMonitorService( PreOrderMonitorService preOrderMonitorService) { this.preOrderMonitorService = preOrderMonitorService; } /** * 定时执行任务..... */ public void exec() { //记录定时任务日志 logger.info("xxxx定时任务开始执行-------------"); boolean isComplete = preOrderMonitorService.execUpdateTask(null); logger.info("xxxx定时任务isComplete:" + isComplete); } }
2、导入依赖
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency>
3、配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> //增加作业类 一、工作的 bean <bean id="quartzSrvBean" class="com.xxx.yyy.common.QuartzSrvBean"> <property name="preOrderMonitorService" ref="preOrderMonitorService"></property> </bean> //执行作业的method(job) <bean id="job2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzSrvBean"></property>
//需要定时执行的方法 <property name="targetMethod" value="exec"></property> </bean> //工作的trigger //简易 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="job2" /> <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 --> <property name="repeatInterval" value="60000" /><!-- 每60秒调度一次 --> </bean> //石英表达式Corn <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="job2" /> <property name="cronExpression" value="0 0/1 14 * * ?" /><!-- 从14点开始直到14点59分每隔1分钟运行一次 --> </bean> //配置调度中心 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean> </beans>
//解释:
(1)、Job:表示一个任务(工作),要执行的具体内容。
(2)、JobDetail:表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外JobDetail 还包含了这个任务调度的方案和策略。
(3)、Trigger:代表一个调度参数的配置,什么时候去调。
(4)、Scheduler:代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与JobDetail 组合,就可以被 Scheduler 容器调度了
4、此时任务就会根据我们的trigger配置的定时规则,有规律的执行。
石英表达式的小技巧:http://cron.qqe2.com/
5、如何监控 Quartz 的 job 执行状态:运行中,暂停中,等待中?
通过往表(新建一个操作日志表)里插入日志的形式:
1)运行中:通过 JobListener 监听器来实现运行时更改表信息。
2)暂停中:调用 scheduler.pauseTrigger()方法时,更改表中 job 信息。
3)等待中:新添加的 job 默认给其等待中的状态,也是更改表中的 job 信息 但是上面这种形式的麻烦之处是得频繁的往表里插入数据。