Quartz定时任务
Quartz
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来执行一个作业而创建简单的或复杂的调度。、
通俗一点来说就是:在某一个有规律的时间点干某件事。并且时间触发的条件可以非常的复杂(比如说每个月的最后一个工作日的17:50),复杂到一个专门的框架来干这个事。Quartz就是来干这个事,你给它一个触发条件的定义,它负责到了时间点,触发相应的Job起来干活。
Quartz包含的4个核心组件
- Job:表示一个工作,要执行的具体的内容,此接口中只有一个方法void execute(JobExecutionContext context)
- JobDetail:表示一个具体可执行的调度程序,Job是这个可执行的调度程序可执行的内容,另外jobderail还包括这个任务调度的方案和策略为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。
- Trigger:触发器,每个任务都会被绑定的trigger根据时间表达式进行触发
- Scheduler:生成的一个工程的定时任务,都交给一个调度器
实现定时任务
需求:在项目中定时删除过期未支付的订单
添加依赖quartz
1 <dependency> 2 <groupId>org.quartz-scheduler</groupId> 3 <artifactId>quartz</artifactId> 4 <version>2.2.1</version> 5 </dependency> 6 //依赖spring支持scheduler的context 7 <dependency> 8 <groupId>org.springframework</groupId> 9 <artifactId>spring-context-support</artifactId> 10 <version>4.3.7.RELEASE</version> 11 </dependency>
代码的编写
编写一个真实执行任务的job类,然后配置spring的管理定时任务的配置文件xml
1 package com.jt.easymall.job; 2 public class OrderOTJob extends QuartzJobBean{ 3 4 //当前的任务执行者,需要调用父类的这个方法来实现 5 //定时触发任务时执行的代码 6 @Override 7 protected void executeInternal(JobExecutionContext context) throws JobExecutionException { 8 //实现mapper的ot方法的调用; 9 //当前这个类,是需要配置绑定jobdetail trigger scheduler这些石英钟 10 //的核心组件一起使用的;无法注入spring的对象 11 //获取spring的上下文对象applicationContext 12 ApplicationContext applicationContext=(ApplicationContext) 13 context.getJobDetail().getJobDataMap(). 14 get("applicationContext"); 15 System.out.println("执行前"); 16 //用上下文对象获取orderMapper,执行删除超时订单的方法 17 Date lastDay=new Date(new Date().getTime()-1000*60*60*24); 18 applicationContext.getBean(OrderMapper.class). 19 deleteOTOrders(lastDay); 20 System.out.println("执行后"); 21 } 22 }
然后配置spring的管理定时任务的配置文件xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 9 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> 10 11 <!-- 定义任务bean --> 12 <bean name="paymentOrderJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 13 <!-- 指定具体的job类 --> 14 <property name="jobClass" value="com.jt.order.job.OrderOTJob" /> 15 <!-- 指定job的名称 --> 16 <property name="name" value="paymentOrder" /> 17 <!-- 指定job的分组 --> 18 <property name="group" value="Order" /> 19 <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 --> 20 <property name="durability" value="true"/> 21 <!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 --> 22 <property name="applicationContextJobDataKey" value="applicationContext"/> 23 </bean> 24 <!-- 定义触发器 --> 25 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 26 <property name="jobDetail" ref="paymentOrderJobDetail" /> 27 <!-- 每一分钟执行一次 --> 28 <property name="cronExpression" value="0 0/1 * * * ?" /> 29 </bean> 30 <!-- 定义调度器 --> 31 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 32 <property name="triggers"> 33 <list> 34 <ref bean="cronTrigger" /> 35 </list> 36 </property> 37 </bean> 38 </beans>
作者:ZHIWEI —— 南岭寒
出处:http://www.cnblogs.com/nanlinghan/
本文版权归作者和博客园共有,欢迎转载。