大多数的B2C商城项目都会有限时活动,当用户下单后都会有支付超时时间,当订单超时后订单的状态就会自动变成已取消 ,这个功能的实现有很多种方法,本文的实现方法适合大多数比较小的商城使用。
实现原理:
利用 jdk 的 DelayQueue的阻塞队列的特性实现。在项目启动时开启一个线程处理 DelayQueue 队列里弹出的超时订单对象,订单未超时该线程处于等待中。
DelayQueue的简单介绍:
DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
实现方式 :
1.创建一个实现Delayed接口的 order 类并重写compareTo和 getDelay方法
2.创建一个帮助类OrderCollection(订单的增删查)
3. 创建CancellOrder类
在生成订单时将订单号创建时间和过期时间封装成一个实现Delayed接口的对象存入DelayQueue队列中,当该订单支付完成后将该对象从队列中移除,(为了保证不丢失订单建议在项目启动时将数据库中的符合条件的订单初始化到DelayQueue队列中 )
实现代码如下:
/** * 类说明 * * @author grl * @date 2019年12月16日 新建 */ public class Order implements Delayed { private String orderShopNum; /** * 1-普通活动 2-限时活动 3-拼购活动 */ private int orderType; private long orderCreateTime; private long expTime; public Order(String orderShopNum, int orderType, Date createTime) { if (StringUtils.isNotBlank(orderShopNum)) { this.orderShopNum = orderShopNum.trim(); } if (createTime == null) { this.orderCreateTime = System.currentTimeMillis(); } else { this.orderCreateTime = createTime.getTime(); } this.orderType = orderType; if (orderType == 2) { this.expTime = TimeUnit.MILLISECONDS.convert(Const.LIMIT_ACTIVITY_EXPIRATION_TIME, TimeUnit.MINUTES) + createTime.getTime(); }if(orderType == 3){ this.expTime = TimeUnit.MILLISECONDS.convert(Const.LIMIT_GROUP_BUY_EXPIRATION_TIME, TimeUnit.MINUTES) + createTime.getTime(); } else { this.expTime = TimeUnit.MILLISECONDS.convert(Const.ORDER_PAYMENT_DEADLINE, TimeUnit.DAYS) + createTime.getTime(); } } public String getOrderShopNum() { return orderShopNum; } public long getOrderCreateTime() { return orderCreateTime; } public long getExpTime() { return expTime; } public int getOrderType() { return orderType; } @Override public int compareTo(Delayed o) { return Long.valueOf(this.expTime).compareTo(Long.valueOf(((Order) o).expTime)); } @Override public long getDelay(TimeUnit unit) { return unit.convert(this.expTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } } /** * 类说明 * * @author grl * @date 2019年12月16日 新建 */ public class OrderCollection { /** * 订单管理集合 */ private static DelayQueue<Order> orderList = new DelayQueue<Order>(); private OrderCollection() { } /** * 获取订单集合 * @author grl * @return */ protected static DelayQueue getOrderCollection() { return orderList; } /** * 向集合中添加订单 * * @author grl * @param order * @return */ public static boolean add(Order order) { boolean flag = false; if (order != null && StringUtils.isNotBlank(order.getOrderShopNum())) { flag = orderList.offer(order); } return flag; } /** * 从集合中删除订单 * * @author grl * @param orderShopNum * @return */ public static boolean remove(String orderShopNum) { boolean flag = false; Order thisOrder = null; if (StringUtils.isNotBlank(orderShopNum)) { orderShopNum = orderShopNum.trim(); for (Order order : orderList) { String orderNum = order.getOrderShopNum(); if (orderNum.equals(orderShopNum)) { thisOrder = order; } } if (thisOrder != null) { flag = orderList.remove(thisOrder); } } return flag; } /** * 获取订单的过期剩余时间 * * @author grl * @param orderShopNum * @param unit * @return -1 已经过期 */ public static long getDelay(String orderShopNum) { long time = -1; if (StringUtils.isNotBlank(orderShopNum)) { orderShopNum = orderShopNum.trim(); for (Order order : orderList) { String orderNum = order.getOrderShopNum(); if (orderNum.equals(orderShopNum)) { time = order.getDelay(TimeUnit.MILLISECONDS); if(time<5000) { time = -1; } } } } return time; } } /** * 类说明 * * @author grl * @date 2019年12月16日 新建 */ @Component public class CancellOrder implements Runnable { private static final Logger log = LoggerFactory.getLogger(CancellOrder.class); @Override public void run() { while (true) { try { Order take = OrderCollection.getOrderCollection().take(); String orderShopNum = take.getOrderShopNum(); int orderType = take.getOrderType(); // 业务逻辑操作 } catch (InterruptedException e) { e.printStackTrace(); log.error("CancellOrder DelayQueue 错误 {}", e.getMessage()); } } } }
总结
以上所述是小编给大家介绍的Java实现商城订单超时取消功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本文向大家介绍php+redis实现商城秒杀功能,包括了php+redis实现商城秒杀功能的使用技巧和注意事项,需要的朋友参考一下 好久没来整理文章了,闲了没事写篇文章记录下php+redis实现商城秒杀功能。 1、安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1.安装php_igbinary.dll,php_redis.dll扩展此处需要注意你的php
本文向大家介绍java商城项目实战之购物车功能实现,包括了java商城项目实战之购物车功能实现的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下 1 需要实现 1、实现淘淘商城的购物车功能 2 购物车功能 2.1 功能说明 1、商品加入购物车时,不是必须要求登录。京东不需要登录,淘宝需要登录。各有好处。 2、计算购物车中商品的总
本文向大家介绍Android实现订单倒计时功能,包括了Android实现订单倒计时功能的使用技巧和注意事项,需要的朋友参考一下 先上效果图 1.activity_main.xml 2.MainActivity.class 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍python实现简单购物商城,包括了python实现简单购物商城的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了购物商城小程序,供大家参考,具体内容如下 软件版本:python3.x 功能:实现简单购物商城 1.允许用户选择购买多少件 2.允许多用户登录,下一次登录后,继续按上次的余额继续购买 3. 允许用户查看之前的购买记录(显示购买时间) 4. 商品列表分级展示 操
说明 支付宝境外到店支付-取消订单 官方文档:https://global.alipay.com/service/external_QR_Code/19 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\Cancel\Request 属性 名称 类型 说明 $service string 接口名称 $timestamp int 商户服务
说明 取消叫车订单,行程中的订单不能取消(司机一旦点击开始计费,订单将不能取消) 司机应答后,乘客取消订单需要强制取消,请求参数时force=true(默认为false),否则会取消失败 请求地址 /v1/order/Cancel 支持格式 Json或普通form HTTP请求方式 Post 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述