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。
- 调度器 负责任务管理.内部有时钟监控
- 触发器 当调度器需要执行任务时,通过触发器启动新的线程去执行.
- 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("每分钟定时任务执行成功!!!!!"); } }