SpringBoot整合quartz定时任务

2,138 阅读3分钟

前因

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

半藏商城中会有一些用户提交了订单但是一直没有支付的情况,这个时候我是通过quartz定时任务每天的5点扫描未支付订单然后读取用户的邮箱地址发送邮件提醒用户尽快支付。接下来分享一下我的quartz定时任务的实现流程。

Maven引包

首先进行在pom.xml中进行引包,还在为引哪个版本的包而困扰的同学推荐这个Maven在线查找依赖的网站,想用什么输入搜索,复制过来就可以了。

<!--quartz 定时任务工具-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.1.13.RELEASE</version>
</dependency>

配置QuartzConfig类

/**
 * @Description: quartz定时任务配置
 * @Author by 皓宇QAQ
 * @Date 2020/3/23 19:51
 * 我的理解 @Configuration是随容器启动开始加载的,始终存在的单例模式。 @Component是使用一次即实例化一次
 */
@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail PayQuartz() {
        return JobBuilder.newJob(CallPayQuartzTask.class).withIdentity("CallPayQuartzTask").storeDurably().build();
    }

    @Bean
    public Trigger CallPayQuartzTaskTrigger() {
        //5秒执行一次
        //创建触发器
//        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
//                .withIntervalInSeconds(5)
//                .repeatForever();
        //cron方式,每天定时执行一次
        //这些星号由左到右按顺序代表 :*    *    *    *    *    *   *
        //格式:                 [秒] [分] [小时] [日] [月] [周] [年]
        return TriggerBuilder.newTrigger().forJob(PayQuartz())
                .withIdentity("CallPayQuartzTask")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 17 * * ?"))
                .build();
    }
}

编写CallPayQuartzTask类

/**
 * @Description: 每天定时扫描订单 未支付状态的单子发送邮件提醒支付
 * @Author by 皓宇QAQ
 * @Date 2020/3/24 12:38
 */
@Slf4j
public class CallPayQuartzTask extends QuartzJobBean{

    @Resource
    private HanZoMallOrderService hanZoMallOrderService;
    @Resource
    private HanZoMallUserService hanZoMallUserService;
    @Resource
    private MailSendService mailSendService;
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //扫描订单 查询是否有订单状态为未支付的情况
        List<HanZoMallOrder> orderListVOS = hanZoMallOrderService.getHanZoMallOrderByOrderStatus(HanZoMallOrderStatusEnum.ORDER_PRE_PAY.getOrderStatus());
        if (orderListVOS!=null){
            //遍历数据发送邮箱提醒用户尽快支付
            log.info("通过Quartz开始批量发送待支付订单邮件提醒");
            for (HanZoMallOrder order : orderListVOS) {
                Long userId= order.getUserId();
                String orderNo = order.getOrderNo();
                int totalPrice =  order.getTotalPrice();
                Date createDate = order.getCreateTime();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH分mm秒");
                String date = sdf.format(createDate);
                HanZoMallUserVO hanZoMallUserVO = hanZoMallUserService.getByPrimaryKey(userId);
                if (hanZoMallUserVO!=null && !StringUtils.isEmpty(hanZoMallUserVO.getEmailAddress())){
                    //用户邮箱不为空 拼接主题、内容给用户发送邮件
                    String subject = "【半藏商城未支付订单提醒】";
                    String content = "您好,你在"+date+"创建的订单号为"+orderNo+"的订单还尚未支付,待支付金额为"+totalPrice+"元,请尽快支付。";
                    mailSendService.sendSimpleMail(hanZoMallUserVO.getEmailAddress(),subject,content);
                }else if (hanZoMallUserVO!=null && hanZoMallUserVO.getLoginName()!=null){
                    //用户邮箱为空 可以给用户发送手机号
                    log.info("用户邮箱为空,可以给用户发送短信提醒");
                    log.info("阿里云不允许个人开通短信提醒的接口,暂时不发送。");
                }else if (hanZoMallUserVO==null){
                    log.info("用户信息为空--无操作--");
                }
            }
        }
    }
}

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

定时发送邮件结果图片

mail.png

小结

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