1 需求概述
用户创建支付订单之后,长时间没有支付,需要将订单关闭。现在存在如下的问题
-
如何确定为长时间未支付的订单:15分钟后
-
如何自动执行?:定时任务
2 定时任务概述
在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛:
-
某些网站会定时发送优惠邮件;
-
银行系统还款日信用卡催收款;
-
某些应用的生日祝福短信等。
那究竟何为定时任务调度,一句话概括就是:在指定的时间规则下,自动执行java方法
定时任务有很多种实现方式:
-
timer
-
基于quartz框架
-
基于Spring task的框架
-
分布式定时任务调度:xxl-job
3 入门案例
1)引导类
引导类上加入注解
@EnableScheduling:开启定时任务支持
2)定时任务类
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 定时任务类
*/
@Component
@Slf4j
public class PaymentJob {
/**
* 定时指定的java方法,没有返回和参数
* eg:每5秒,打印系统时间
* eg:每1分钟,查询数据库中未支付的订单(时间大于15分钟),调用微信获取支付结果
*/
@Scheduled(cron = "0/5 * * * * ?")
public void handle() {
String now = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
log.info("当前时间:{}",now);
}
//案例演示
@Scheduled(cron = "0 0/1 * * * ?")
public void handle() {
String now = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
log.info("当前时间:{}",now);
try {
//清理超时订单
ordersService.getPayment();
}catch (Exception e) {
log.error(e.getMessage(),e);
}
}
}
注意:真实的定时任务代码是写在定时任务类的方法里的,一般都直接调用service。定时任务类写在task包下
4 corn表达式
对于定时任务,我们使用的时候主要是注重两个方面,一个是定时任务的业务,另一个就是Cron表达式。
Cron 表达式支持到六个域
名称 | 是否必须 | 允许值 | 特殊字符 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日 | 是 | 1-31 | , - * ? / L W C |
月 | 是 | 1-12 或 JAN-DEC | , - * / |
周 | 是 | 1-7 或 SUN-SAT | , - * ? / L C # |
月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。 域之间有空格分隔