定时任务(corn表达式)

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 是一样的。 域之间有空格分隔  

你可能感兴趣的:(java,spring,servlet)