Quartz定时任务

1.1 导入时间表达式工具

 

 

Quartz项目导入项目,之后执行Main.java展现表达式工具

 

 

该工具是cron时间表达式生成器.用于定时任务.也可以网上直接生成:  https://cron.qqe2.com/

1.2业务需求

说明:如果用户提交了订单.在30分钟之内没有完成支付,则将订单的状态由1改为6.

1.2.1 定时任务Quartz

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

 

 

  1. 调度器 负责任务管理.内部有时钟监控
  2. 触发器 当调度器需要执行任务时,通过触发器启动新的线程去执行.
  3. JOB/JobDetail 定义任务. JobDetail表示包装任务

1.2.2    定时任务配置

1.2.2.1    引入jar包

<!--添加Quartz的支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

1.2.2.2 编辑配置类

@Configuration
public class OrderQuartzConfig {
    
    //定义任务详情
    @Bean
    public JobDetail orderjobDetail() {
        //指定job的名称和持久化保存任务
        return JobBuilder
                .newJob(OrderQuartz.class) //任务类
                .withIdentity("orderQuartz") //任务名称
                .storeDurably()
                .build();
    }
    //定义触发器
    @Bean
    public Trigger orderTrigger() {
        /*SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInMinutes(1)    //定义时间周期
                .repeatForever();*/
        CronScheduleBuilder scheduleBuilder 
            = CronScheduleBuilder.cronSchedule("0 0/1 * * * ?");
       //调度器时钟,时间表达式,每隔一分钟执行一次        
return TriggerBuilder
                .newTrigger()
                .forJob(orderjobDetail())//调用任务详情
                .withIdentity("orderQuartz")
                .withSchedule(scheduleBuilder).build();//添加定时调度器时钟
    }
}

1.2.2.3 编辑定时任务类

//准备订单定时任务
@Component //继承QuartzJobBean任务对象,OrderQuartz任务类交给spring容器管理
public class OrderQuartz extends QuartzJobBean{

    @Autowired //操作数据库注入orderMapper
    private OrderMapper orderMapper;

    /**
     * 业务思想:

     *     用户30分钟内,没有支付则将状态改为6交易关闭
     现在时间 - 订单创建时间 > 30分钟  则超时
     new date - 30 分钟 > 订单创建时间
     * sql:
     *     update tb_order set status = 6,
     *                     updated=#{date}
     *  where status=1 and created<now-30
     * 
     */
    //当程序执行时 执行该方法
    @Override
    @Transactional //当程序执行时,执行该方法
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        Calendar calendar = Calendar.getInstance(); //获取当前时间
        calendar.add(Calendar.MINUTE, -30); //当前时间减30分钟
        Date timeOutDate = calendar.getTime();

        Order order = new Order();
        order.setStatus(6).setUpdated(new Date());

        UpdateWrapper<Order> updateWrapper = new UpdateWrapper<Order>();
        updateWrapper.eq("status", 1)
                     .lt("created", timeOutDate);

        orderMapper.update(order, updateWrapper);
        System.out.println("每分钟定时任务执行成功!!!!!");
    }
}

 

posted @ 2021-04-27 23:56  当当小丸子  阅读(1839)  评论(0编辑  收藏  举报