1.定时任务调用原理
调度器:负责时间监控,如果任务到了指定时间则调用器开始工作.
触发器:当调度器执行任务时,会调用触发器开启线程完成任务.
JOB:定时任务统称.
JOBDetail: 定时任务的具体的细节
调用过程:
-
新创建定时任务.将任务交给调度器管理
-
调用器负责监控时间,当到了指定的时间后.调用触发器开启新的线程去完成任务.
-
当触发器接收到执行指令后.开启线程完成具体的任务.
Spring整合Quartz
1.添加jar包
<!-- 定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!--定时任务需要依赖c3p0jar包 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
2.编辑配置文件
<!-- 定义任务bean -->
<bean name="paymentOrderJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定具体的job类 -->
<property name="jobClass" value="com.XX.order.job.PaymentOrderJob" />
<!-- 指定job的名称 -->
<property name="name" value="paymentOrder" />
<!-- 指定job的分组 -->
<property name="group" value="Order" />
<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 -->
<property name="durability" value="true"/>
<!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
<property name="applicationContextJobDataKey" value="applicationContext"/>
</bean>
<!-- 定义触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="paymentOrderJobDetail" />
<!-- 每一分钟执行一次 -->
<property name="cronExpression" value="0 0/1 * * * ?" />
</bean>
<!-- 定义调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
3.编辑定时任务
public class PaymentOrderJob extends QuartzJobBean{
/**
* 要求:如果用户2天没有支付.则将订单做超时处理
* 业务逻辑:
* update tb_order set status = 6,updated = now()
* where status = 1 and created < 现在时间-2天
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
//删除2天天的恶意订单
ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap().get("applicationContext");
//计算2天前的时间
Date agoDate = new DateTime().minusDays(2).toDate();
//获取orderMapper接口
OrderMapper orderMapper = applicationContext.getBean(OrderMapper.class);
orderMapper.updateStatus(agoDate);
System.out.println("定时任务执行成功!!!!");
}
}
4.编辑Mapper映射文件
<!--执行定时任务 -->
<update id="updateStatus">
<![CDATA[
update tb_order set status = 6,updated = now() where
status = 1 and created < #{agoDate}
]]>
</update>