• 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>
  • 相关阅读:
    《Think Python》第7章学习笔记
    Arrays和String单元测试
    结对编程项目-四则运算 第二周
    2018-2019-2 20175227张雪莹《Java程序设计》 实验二《Java面向对象程序设计》
    类定义
    20175227张雪莹 2018-2019-2 《Java程序设计》第六周学习总结
    结对编程项目-四则运算 第一周 阶段性总结
    迭代和JDB
    20175227张雪莹 2018-2019-2 《Java程序设计》第五周学习总结
    结对学习小组
  • 原文地址:https://www.cnblogs.com/nanlinghan/p/quartz.html
Copyright © 2020-2023  润新知