前因

温馨提醒:阅读本文需要6分钟

[半藏商城]中会有一些用户提交了订单但是一直没有支付的情况,之前我是通过quartz定时任务每天的5点扫描未支付订单然后读取用户的邮箱地址发送邮件提醒用户尽快支付。这次我是采用Spring中自带的SpringTask来进行定时任务。

Cron表达式

Cron表达式是一个字符串,包括6~7个时间元素,在SpringTask中可以用于指定任务的执行时间。

Cron的语法格式

Seconds Minutes Hours DayofMonth Month DayofWeek

Cron格式中每个时间元素的说明

时间元素  可出现的字符   有效数值范围
Seconds   , - * /        0-59
Minutes   , - * /        0-59
Hours     , - * /        0-23
DayofMonth, - * / ? L W  0-31
Month     , - * /        1-12
DayofWeek , - * / ? L #  1-7或SUN-SAT

Cron格式中特殊字符说明

字符	作用		举例
,	列出枚举值	在Minutes域使用5,10,表示在5分和10分各触发一次
-	表示触发范围	在Minutes域使用5-10,表示从5分到10分钟每分钟触发一次
*	匹配任意值	在Minutes域使用*, 表示每分钟都会触发一次
/	起始时间开始触发,每隔固定时间触发一次	在Minutes域使用5/10,表示5分时触发一次,每10分钟再触发一次
?	在DayofMonth和DayofWeek中,用于匹配任意值	在DayofMonth域使用?,表示每天都触发一次
#	在DayofMonth中,确定第几个星期几	1#3表示第三个星期日
L	表示最后	在DayofWeek中使用5L,表示在最后一个星期四触发
W	表示有效工作日(周一到周五)	在DayofMonth使用5W,如果5日是星期六,则将在最近的工作日4日触发一次

整合SpringTask

由于SpringTask已经存在于Spring框架中,所以无需添加依赖。

配置SpringTaskConfig类

只需要在配置类中添加一个@EnableScheduling注解即可开启SpringTask的定时任务能力。

@Configuration
@EnableScheduling
public class SpringTaskConfig {
}

添加CallPaySpringTask类来执行定时任务

package ltd.hanzo.mall.task;

import lombok.extern.slf4j.Slf4j;
import ltd.hanzo.mall.service.TaskService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

/**
 * @Author 皓宇QAQ
 * @email 2469653218@qq.com
 * @Date 2020/5/19 23:33
 * @link https://github.com/Tianhaoy/hanzomall
 * @Description: 每天定时扫描订单 未支付状态的单子发送邮件提醒支付
 */
@Slf4j
@Component
public class CallPaySpringTask {

    @Resource
    private TaskService taskService;

    /**
     * cron表达式:Seconds Minutes Hours DayOfMonth Month DayOfWeek [Year]
     */
    @Scheduled(cron = "0 0 5 * * ?")
    private void callPay() {
        log.info("通过SpringTask开始批量发送待支付订单邮件提醒");
	//这里调用自己的定时任务接口--我这里调用的是发送待支付订单邮件的接口
        taskService.callPayOrders();
    }
}

还有一些查找订单信息的service层 mapper层代码就不贴出了,根据自己的业务进行开发就可以。主要是分享流程,代码实现并不难。

小结

到此为止,整个通过SpringTask定时任务发送邮件信息的流程就介绍完毕了,知识只有分享出来才有价值。如果有问题的话,可以在关于我的页面,通过我的邮箱联系我进行探讨。

Q.E.D.


Remain true to our original aspiration.