应用场景:电商项目中,如果一个订单如果长时间没有支付,那么则订单应该做超时处理.

 

Quartz介绍

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EEJ2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBsQuartz的最新版本为Quartz 2.3.0

 

Quarez定时任务.可以在任何时间间隔内启动定时任务(JOB)

1.30秒执行一次,或者40秒/50秒执行一次

2.在一天内执行几次

3.可以执行一个月内执行几次

4.可以在一年内执行几次.

 

1.调度器

主要监控定时任务的时间,如果时间到了则开始运行任务

2.JOB

主要描述,做什么样的操作

3.触发器

当接收到调度器的指令后,运行指定的任务.

调用流程:

1.当一个任务定义之后(job),需要将任务的信息(任务处理类/方法)需要注册到调度器中.

2.调度器会实时的监控哪些任务需要马上执行.如果到了执行的时间则会调用触发器执行任务.

3.接收到处理任务后,触发器开启一个线程执行该任务.等待下一次任务的执行.

 

将将jar包文件添加到项目的parent中,之后打包

<!-- 定时任务 -->

        <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>

 

调度器配置文件:

<!-- 定义任务bean -->

    <bean name="paymentOrderJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

        <!-- 指定具体的job类 -->

        <property name="jobClass" value="com.jt.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>

 

定时任务处理类:

//定时任务的处理类

public class PaymentOrderJob extends QuartzJobBean{

    

    @Override

    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

        //获取spring容器对象

        ApplicationContext springContext =

                (ApplicationContext)

                context.getJobDetail().getJobDataMap().get("applicationContext");

       

        //获取orderMapper接口

        OrderMapper mapper =

                springContext.getBean(OrderMapper.class);

       

        //需要将超时的订单做过期处理

        //**

         /* 1.2天没有支付则超时

         * 2.需要关闭未支付的订单 状态码为1改为6

         * 3.

         * sql:update 表名 set status = 6

         * where status = 1 and created < new Date() - 2

         */

        Date agoDate = new DateTime().minusDays(2).toDate();

       

        //执行超时任务

        mapper.updateStatus(agoDate);

        System.out.println("定时任务操作成功!!!!!");

    }

}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐