【Quartz】——利用Quartz处理超时未付款的订单

简介: 【Quartz】——利用Quartz处理超时未付款的订单

引言

 

在电商项目中我们比较常见的问题就是那些未付款的订单,我们需要在一定的时间以后自动关闭交易,如果这个任务是通过人工来完成,工作量是相当可观的,所以我们采用一个定时任务,自动扫面那些订单,然后自动关闭!

 

有了前面我们对shpring 整合的基础以后,我们在实现这个功能的时候就非常的的简单了

 

编写job类代码

package com.taotao.store.order.job;
import org.joda.time.DateTime;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.taotao.store.order.mapper.OrderMapper;
/**
 * 扫描超过2天未付款的订单关闭
 */
public class PaymentOrderJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap()
                .get("applicationContext");
        //时间参数,当前时间向前推2天
        applicationContext.getBean(OrderMapper.class).paymentOrderScan(new DateTime().minusDays(2).toDate());
    }
}

对应的mapper接口代码

package com.taotao.store.order.mapper;
import java.util.Date;
import org.apache.ibatis.annotations.Param;
import com.taotao.store.order.pojo.Order;
public interface OrderMapper extends IMapper<Order>{
  public void paymentOrderScan(@Param("date") Date date);
}

映射文件代码

  <update id="paymentOrderScan" parameterType="Date">
    UPDATE tb_order SET
      status = 6,
      update_time = NOW(),
      close_time = NOW(),
      end_time = NOW()
    WHERE status = 1 AND payment_type = 1 AND create_time <= #{date}
  </update>

这个job代码的作用就是,按照编写好的任务频率,执行OrderMapper接口中的paymentOrderScan方法,这个方法接受一个时间类型的参数,以当期时间往前推两天。然后执行更新数据库订单状态。

 

配置文件内容

<!-- 定义任务bean -->
  <bean name="paymentOrderJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <!-- 指定具体的job类 -->
    <property name="jobClass" value="com.taotao.store.order.job.PaymentOrderJob" />
    <!-- 指定job的名称 -->
    <property name="name" value="paymentOrder" />
    <!-- 指定job的分组 -->
    <property name="group" value="Order" />
    <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务  -->
    <property name="durability" value="true"/>
    <!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
    <property name="applicationContextJobDataKey" value="applicationContext"/>
  </bean>
  <!-- 定义触发器 -->
  <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="paymentOrderJobDetail" />
    <!-- 每一分钟执行一次 -->
    <property name="cronExpression" value="0 0/1 * * * ?" />
  </bean>
  <!-- 定义调度器 -->
  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      <property name="triggers">
          <list>
              <ref bean="cronTrigger" />
          </list>
      </property>
  </bean>


我们现在的事件频率是每个一分钟执行一次,所以我们关闭订单的误差在一分钟之内,如果对于误差要求比较高的需求,我们可以自行设定执行频率。

目录
相关文章
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
支付系统39----支付宝支付,定时查单,每隔30秒执行1次,查询超过5分钟,并且未支付的订单
|
前端开发 Java Linux
《Linux篇》02.超详细SpringBoot项目部署教程(附脚本自动部署)(三)
《Linux篇》02.超详细SpringBoot项目部署教程(附脚本自动部署)(三)
2174 0
《Linux篇》02.超详细SpringBoot项目部署教程(附脚本自动部署)(三)
|
负载均衡 前端开发 应用服务中间件
【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包
【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包
1011 0
|
10月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
510 29
|
Web App开发 JSON 安全
Chrome浏览器的跨域问题
【10月更文挑战第6天】
2088 123
|
机器学习/深度学习 存储 分布式计算
驾驭数据洪流:大数据处理的技术与应用
大数据处理不仅是信息技术领域的一个热门话题,也是推动各行各业创新和发展的重要力量。随着技术的进步和社会需求的变化,大数据处理将继续发挥其核心作用,为企业创造更多的商业价值和社会贡献。未来,大数据处理将更加注重智能化、实时性和安全性,以应对不断增长的数据挑战。
|
安全 Java 数据库
Spring Security 权限管理详解与案例
Spring Security 是 Spring 框架中用于提供认证和访问控制的模块。它保护了成千上万的应用程序,使其免受未经授权的访问。本文将详细介绍 Spring Security 的权限管理功能,并通过一个实际案例来展示其用法。
1512 1
|
消息中间件 Java 关系型数据库
【Spring Boot+Kafka+Mysql+HBase】实现分布式优惠券后台应用系统(附源码)
【Spring Boot+Kafka+Mysql+HBase】实现分布式优惠券后台应用系统(附源码)
580 2
|
消息中间件 Java 数据库
秒杀系统库存超卖问题:从传统解决方案到引入RabbitMQ
秒杀系统库存超卖问题:从传统解决方案到引入RabbitMQ
804 0
|
关系型数据库 MySQL
【MySQL用法】mysql日期时间函数总结(附带mysql官网介绍)
【MySQL用法】mysql日期时间函数总结(附带mysql官网介绍)
501 0