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>

 

posted @ 2019-01-26 17:46  南岭寒  Views(519)  Comments(0Edit  收藏  举报