【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分钟,并且未支付的订单
|
Cloud Native 安全 Java
go和java的比较
go和java的比较
|
前端开发 Java Linux
《Linux篇》02.超详细SpringBoot项目部署教程(附脚本自动部署)(三)
《Linux篇》02.超详细SpringBoot项目部署教程(附脚本自动部署)(三)
2085 0
《Linux篇》02.超详细SpringBoot项目部署教程(附脚本自动部署)(三)
|
8月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
351 29
|
消息中间件 NoSQL Kafka
订单超时取消的11种方式(非常详细清楚)
订单超时取消的11种方式(非常详细清楚)
6815 4
订单超时取消的11种方式(非常详细清楚)
|
消息中间件 存储 Java
RabbitMQ入门指南(八):MQ可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了MQ数据持久化、LazyQueue模式、管理控制台配置Lazy模式、代码配置Lazy模式、更新已有队列为lazy模式等内容。
983 0
|
存储 缓存 NoSQL
缓存、分布式缓存和持久化
这篇内容介绍了缓存的概念和Redis的作用,以口袋与公文包的比喻解释了缓存如何提高数据访问速度。Redis是一个内存中的高级缓存系统,能提升系统响应速度。接着讨论了为何需要分布式缓存,通过多个“篮子”(Redis节点)解决单点故障和性能瓶颈,保证高可用性和数据安全性。最后提到了Redis的两种持久化机制——RDB(定期数据快照)和AOF(记录写操作日志),分别用照片备份和实时同步来比喻,说明它们在数据丢失风险和恢复速度上的权衡。
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
37654 5
|
安全 Java 数据库
Spring Security 权限管理详解与案例
Spring Security 是 Spring 框架中用于提供认证和访问控制的模块。它保护了成千上万的应用程序,使其免受未经授权的访问。本文将详细介绍 Spring Security 的权限管理功能,并通过一个实际案例来展示其用法。
1397 1
解决IDEA中 Could not autowire. No beans of 'xxxx' type found 的错误提示
解决IDEA中 Could not autowire. No beans of 'xxxx' type found 的错误提示
12525 3
解决IDEA中 Could not autowire. No beans of 'xxxx' type found 的错误提示