一、生成订单时发起延时30分钟的任务
/*** 订单发起延迟任务* @param order 订单*/@Overridepublic void startCancelOrderTask(Order order){if(order.getState().equals(OrderStateEnum.ORDER_STATE_1.getCode())){OrderSchedule.getInstance().startTask( new OrderFailureJob(order.getOrderSn()), Const.ORDER_CANCEL_TIME, TimeUnit.MINUTES);}}

Const.ORDER_CANCEL_TIME 为取消时间 30分钟定义常量,单位分钟

二、OrderSchedule
package com.ghgcn.cigarbox.task.job;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class OrderSchedule {private static ScheduledExecutorService Manager;private static OrderSchedule orderSchedule;static{Manager = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());}private OrderSchedule(){}public synchronized static OrderSchedule getInstance(){if(orderSchedule == null){orderSchedule = new OrderSchedule();}return orderSchedule;}/*** 生成订单时调用,一段时间后订单取消*/public void startTask(Runnable task,long delay ,TimeUnit time ){Manager.schedule(task,delay,time);}
}
三、OrderFailureJob
package com.ghgcn.cigarbox.task.job;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import org.jflame.toolkit.util.DateHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.ghgcn.cigarbox.common.enums.OrderEnums.OrderStatusEnum;
import com.ghgcn.cigarbox.common.enums.OrderEnums.PayStatusEnum;
import com.ghgcn.cigarbox.entity.OrderInfo;
import com.ghgcn.cigarbox.service.IOrderInfoService;
import com.ghgcn.cigarbox.support.SpringContextHolder;
/*** * @ClassName: OrderFailureJob* @Description: 定时取消订单* @author * @date **/
public class OrderFailureJob implements Runnable {private Logger logger = LoggerFactory.getLogger(OrderFailureJob.class);private Integer orderId;private static Lock lock = new ReentrantLock();/**获取Servcie*/private IOrderInfoService orderInfoService =  SpringContextHolder.getBean(IOrderInfoService.class);public OrderFailureJob(Integer orderId) {super();this.orderId = orderId;
logger.debug("orderId  {} ",orderId);
logger.debug("orderInfoService  {} ",orderInfoService.toString());}@Overridepublic void run() {/*** 查询订单*/OrderInfo info = orderInfoService.selectOrderInfoByOrderId(orderId);logger.info(" 订单信息  {} ",info.toString());if (info.getOrderStatus().equals(OrderStatusEnum.NORMAL.ordinal())&& info.getPayStatus().equals(PayStatusEnum.NOPAY.ordinal())) {lock.lock();try{/**更改订单状态*/info.setOrderStatus(OrderStatusEnum.CANCEL.ordinal());info.setUpdateDate(DateHelper.nowTimestamp());orderInfoService.updateOrderInfo(info);}finally{lock.unlock();}}}}
四、SpringContextHolder
package com.ghgcn.cigarbox.support;import java.util.Locale;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;@Component
public final class SpringContextHolder implements ApplicationContextAware {private static ApplicationContext springContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringContextHolder.springContext = applicationContext;}/*** 返回spring上下文环境对象* * @return ApplicationContext*/public static ApplicationContext getSpringContext() {return springContext;}/*** 按名称获取spring bean* * @param name* @return*/public static Object getBean(String name) {return springContext.getBean(name);}/*** 按类型获取spring bean* * @param requiredType* @return*/public static <T> T getBean(Class<T> requiredType) {return springContext.getBean(requiredType);}/*** 发布事件到spring* @param event*/public static void pushEvent(ApplicationEvent event) {springContext.publishEvent(event);}}

Java 之未支付订单30分钟后自动取消相关推荐

  1. java实现订单未支付失效_未支付订单30分钟后,自动取消

    未支付订单30分钟后,自动取消 生成订单时发起延时30分钟的任务 /** * 取消订单的任务 * @Title: startCancelOrderTask * @Description: 取消订单的任 ...

  2. windows 远程 登录无操作30分钟后自动退出登录_【计时优易学车远程教育学习流程】...

    重要通知: 1.2020年11月21日之后报名的学员,目前不需要到驾校学习科目一(4小时)及科目四(2小时),可直接用优易学车app远程教育学习,请12月6日之前尽快将科目一及科目四学时学完,如后期有 ...

  3. windows 远程 登录无操作30分钟后自动退出登录_Mac电脑如何远程Windows10

    使用Mac电脑的你如何远程控制Win10电脑呢?相信好多人都是一头雾水,不知如何下手.这里小编为大家带来了一款非常不错的微软远程连接软件Microsoft Remote Desktop for mac ...

  4. 面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源 | https://blog.csdn.net/hjm4702192/article/details/80519010 在开发 ...

  5. 订单30分钟未支付自动取消怎么实现?

    本文已经收录到Github仓库,该仓库包含计算机基础.Java核心知识点.多线程.JVM.常见框架.分布式.微服务.设计模式.架构等核心知识点,欢迎star~ 地址:https://github.co ...

  6. 面试官:生成订单30分钟未支付,则自动取消,该怎么实现?

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 目录 了解需求 方案 1:数据库轮询 方案 2:JDK 的延迟队列 方案 3:时间轮算法 方案 4:redis 缓存 方案 5:使用 ...

  7. 实现生成订单30分钟未支付,则自动取消

    目录 了解需求 方案 1:数据库轮询 思路 实现 优点 缺点 方案 2:JDK 的延迟队列 思路 实现 优点 缺点 方案 3:时间轮算法 思路 实现 优点 缺点 方案 4:redis 缓存 思路一 实 ...

  8. 从零开发短视频电商 30分钟未支付订单自动关闭、七天自动确认收货等延迟任务问题

    文章目录 常见延迟任务 常见解决方案 主动形式 被动形式 基于Redis实现ZSet的方式.键空间通知的方式 ZSet的方式 键空间通知的方式 RocketMQ延迟消息 延迟消息级别配置 客户端发送延 ...

  9. 生成订单30分钟未支付,则自动取消,该怎么实现?(典藏版)

    目录 方案分析 (1)数据库轮询 (2)JDK的延迟队列 (3)时间轮算法 (4)redis缓存 (5)使用消息队列 在开发中,往往会遇到一些关于延时任务的需求.例如 生成订单30分钟未支付,则自动取 ...

  10. 如何实现生成订单30分钟内未支付则自动取消?

    如何实现生成订单30分钟内未支付则自动取消? 数据库轮询 JDK的延迟队列 Quartz 时间轮算法 使用消息队列 数据库轮询 不是很推荐的一种方式,需要定时扫描数据库,借助定时任务工具,如果是多服务 ...

最新文章

  1. Cuda中Global memory中coalescing例程解释
  2. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表
  3. 在Latex中插入Python代码
  4. 做操作系统的公司,为什么不能把系统安全做好?
  5. 数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)
  6. AndroidStudio安卓原生开发_activity之间复杂对象类型的数据传递---Android原生开发工作笔记92
  7. 网路游侠:计算机保密检查工具大全 2009版
  8. Windows 下安装 swoole 具体步骤(转)
  9. 如何更改IE窗口初始大小及位置
  10. Padavan各源码融合教程
  11. java兔子繁殖总数_Java 兔子繁殖迭代问题
  12. 循环减肥c语言,减肥,这次终于告别一再反弹的死循环
  13. java网易云信怎么用_网易云信Web IM入门(二)
  14. windos找不到文件:打开fla文件时候报错!
  15. 关于 Java 的线程状态
  16. [已解决]Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()'
  17. 如何使用阿里云服务器快速搭建个人网站?
  18. 零售巨头家乐福在西班牙推出家禽区块链食物追踪平台
  19. 杂文(1):Java对象引用详解
  20. 侯捷C++->三大函数:拷贝构造、拷贝赋值、析构

热门文章

  1. 给IT新人的15点建议:苦逼程序员的辛酸反省与总结
  2. 2021年总结:回顾这不平凡的一年
  3. 华为“天才少女”年薪156万:她靠什么改写了普通女孩的人生?
  4. 邢帅——一个逆袭的草根
  5. NOI2021 D类打铁记
  6. 如何设置CentOS 7获取动态ip地址
  7. wing ftp linux 怎么用,Wing FTP Server使用方法(操作步骤)
  8. 川土微 数字隔离器CA-IS306X集成隔离电源的隔离式CAN收发器
  9. M1 Macbook崩溃了怎么办?
  10. nested renamer is not supported