,大多数的B2C商城项目都会有限时活动,当用户下单后都会有支付超时时间,当订单超时后订单的状态就会自动变成已取消,这个功能的实现有很多种方法,本文的实现方法适合大多数比较小的商城使用。
,,,,利用jdk的DelayQueue的阻塞队列的特性实现。在项目启动时开启一个线程处理DelayQueue队列里弹出的超时订单对象,订单未超时该线程处于等待中。
,,,DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了延迟接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将零元素放置到这种队列中。
,1.创建一个实现推迟接口的订单类并重写compareTo和getDelay方法
,2 .创建一个帮助类OrderCollection(订单的增删查)
,3.创建CancellOrder类
,在生成订单时将订单号创建时间和过期时间封装成一个实现推迟接口的对象存入DelayQueue队列中,当该订单支付完成后将该对象从队列中移除,(为了保证不丢失订单建议在项目启动时将数据库中的符合条件的订单初始化到DelayQueue队列中)
实现代码如下:
/* * *类说明 * * @author grl * @date 2019年12月16日新建 */公共类订单实现延迟{ 私人字符串orderShopNum;/* * * 1 -普通活动2 -限时活动3 -拼购活动 */私人int订单类型; 私人长orderCreateTime; 私人长expTime; 公共秩序(字符串orderShopNum, int订单类型、日期createTime) { 如果(StringUtils.isNotBlank (orderShopNum)) { 这一点。orderShopNum=orderShopNum.trim (); } 如果(createTime==null) { 这一点。orderCreateTime=System.currentTimeMillis (); 其他}{ 这一点。orderCreateTime=createTime.getTime (); } 这一点。订单类型=订单类型; 如果(订单类型==2){ 这一点。expTime=TimeUnit.MILLISECONDS.convert (Const。LIMIT_ACTIVITY_EXPIRATION_TIME TimeUnit.MINUTES) + createTime.getTime (); }如果(订单类型==3){ 这一点。expTime=TimeUnit.MILLISECONDS.convert (Const。LIMIT_GROUP_BUY_EXPIRATION_TIME TimeUnit.MINUTES) + createTime.getTime (); 其他}{ 这一点。expTime=TimeUnit.MILLISECONDS.convert (Const。ORDER_PAYMENT_DEADLINE TimeUnit.DAYS) + createTime.getTime (); } } 公共字符串getOrderShopNum () { 返回orderShopNum; } 公共长getOrderCreateTime () { 返回orderCreateTime; } 公共长getExpTime () { 返回expTime; } 公共int getOrderType () { 返回订单类型; } @Override 公共int compareTo(延迟o) { 返回Long.valueOf (this.expTime) .compareTo (Long.valueOf(((顺序)o) .expTime)); } @Override 公共长getDelay (TimeUnit unit) { 返回unit.convert(这一点。expTime - System.currentTimeMillis (), TimeUnit.MILLISECONDS); } }/* * *类说明 * * @author grl * @date 2019年12月16日新建 */公开课OrderCollection {/* * *订单管理集合 */私有静态DelayQueueorderList=new DelayQueue (); 私人OrderCollection () { }/* * *获取订单集合 * @author grl * @return */保护静态DelayQueue getOrderCollection () { 返回orderList; }/* * *向集合中添加订单 * * @author grl * @param秩序 * @return */公共静态逻辑加(订单顺序){ 布尔标志=false; 如果订单!=零,,StringUtils.isNotBlank (order.getOrderShopNum ())) { 国旗=orderList.offer(秩序); } 返回国旗; }/* * *从集合中删除订单 * * @author grl * @param orderShopNum * @return */公共静态逻辑删除(字符串orderShopNum) { 布尔标志=false; 订单thisOrder=零; 如果(StringUtils.isNotBlank (orderShopNum)) { orderShopNum=orderShopNum.trim (); (订单秩序:orderList) { 字符串orderNum=order.getOrderShopNum (); 如果(orderNum.equals (orderShopNum)) { thisOrder=订单; } } 如果(thisOrder !=null) { 国旗=orderList.remove (thisOrder); } } 返回国旗; }/* * *获取订单的过期剩余时间 * * @author grl * @param orderShopNum * @param单位 * @return 1已经过期 */公共静态长getDelay(字符串orderShopNum) { 长时间=1; 如果(StringUtils.isNotBlank (orderShopNum)) { orderShopNum=orderShopNum.trim (); (订单秩序:orderList) { 字符串orderNum=order.getOrderShopNum (); 如果(orderNum.equals (orderShopNum)) { 时间=order.getDelay (TimeUnit.MILLISECONDS); 如果(time Java实现商城订单超时取消功能