Java 之未支付订单30分钟后自动取消
一、生成订单时发起延时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分钟后自动取消相关推荐
- java实现订单未支付失效_未支付订单30分钟后,自动取消
未支付订单30分钟后,自动取消 生成订单时发起延时30分钟的任务 /** * 取消订单的任务 * @Title: startCancelOrderTask * @Description: 取消订单的任 ...
- windows 远程 登录无操作30分钟后自动退出登录_【计时优易学车远程教育学习流程】...
重要通知: 1.2020年11月21日之后报名的学员,目前不需要到驾校学习科目一(4小时)及科目四(2小时),可直接用优易学车app远程教育学习,请12月6日之前尽快将科目一及科目四学时学完,如后期有 ...
- windows 远程 登录无操作30分钟后自动退出登录_Mac电脑如何远程Windows10
使用Mac电脑的你如何远程控制Win10电脑呢?相信好多人都是一头雾水,不知如何下手.这里小编为大家带来了一款非常不错的微软远程连接软件Microsoft Remote Desktop for mac ...
- 面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?
欢迎关注方志朋的博客,回复"666"获面试宝典 来源 | https://blog.csdn.net/hjm4702192/article/details/80519010 在开发 ...
- 订单30分钟未支付自动取消怎么实现?
本文已经收录到Github仓库,该仓库包含计算机基础.Java核心知识点.多线程.JVM.常见框架.分布式.微服务.设计模式.架构等核心知识点,欢迎star~ 地址:https://github.co ...
- 面试官:生成订单30分钟未支付,则自动取消,该怎么实现?
Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 目录 了解需求 方案 1:数据库轮询 方案 2:JDK 的延迟队列 方案 3:时间轮算法 方案 4:redis 缓存 方案 5:使用 ...
- 实现生成订单30分钟未支付,则自动取消
目录 了解需求 方案 1:数据库轮询 思路 实现 优点 缺点 方案 2:JDK 的延迟队列 思路 实现 优点 缺点 方案 3:时间轮算法 思路 实现 优点 缺点 方案 4:redis 缓存 思路一 实 ...
- 从零开发短视频电商 30分钟未支付订单自动关闭、七天自动确认收货等延迟任务问题
文章目录 常见延迟任务 常见解决方案 主动形式 被动形式 基于Redis实现ZSet的方式.键空间通知的方式 ZSet的方式 键空间通知的方式 RocketMQ延迟消息 延迟消息级别配置 客户端发送延 ...
- 生成订单30分钟未支付,则自动取消,该怎么实现?(典藏版)
目录 方案分析 (1)数据库轮询 (2)JDK的延迟队列 (3)时间轮算法 (4)redis缓存 (5)使用消息队列 在开发中,往往会遇到一些关于延时任务的需求.例如 生成订单30分钟未支付,则自动取 ...
- 如何实现生成订单30分钟内未支付则自动取消?
如何实现生成订单30分钟内未支付则自动取消? 数据库轮询 JDK的延迟队列 Quartz 时间轮算法 使用消息队列 数据库轮询 不是很推荐的一种方式,需要定时扫描数据库,借助定时任务工具,如果是多服务 ...
最新文章
- Cuda中Global memory中coalescing例程解释
- NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表
- 在Latex中插入Python代码
- 做操作系统的公司,为什么不能把系统安全做好?
- 数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)
- AndroidStudio安卓原生开发_activity之间复杂对象类型的数据传递---Android原生开发工作笔记92
- 网路游侠:计算机保密检查工具大全 2009版
- Windows 下安装 swoole 具体步骤(转)
- 如何更改IE窗口初始大小及位置
- Padavan各源码融合教程
- java兔子繁殖总数_Java 兔子繁殖迭代问题
- 循环减肥c语言,减肥,这次终于告别一再反弹的死循环
- java网易云信怎么用_网易云信Web IM入门(二)
- windos找不到文件:打开fla文件时候报错!
- 关于 Java 的线程状态
- [已解决]Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()'
- 如何使用阿里云服务器快速搭建个人网站?
- 零售巨头家乐福在西班牙推出家禽区块链食物追踪平台
- 杂文(1):Java对象引用详解
- 侯捷C++->三大函数:拷贝构造、拷贝赋值、析构