Java实现商城订单超时取消功能
⼤多数的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)) {
}
if (createTime == null) {
} el {
}
if (orderType == 2) {
+ Time();
}if(orderType == 3){
+ Time();
} el {
+ Time();
}
有关秋的诗}
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.pTime).compareTo(Long.valueOf(((Order) o).expTime));
}
@Override
public long getDelay(TimeUnit unit) {同心抗疫作文
pTime - 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 = fal;
if (order != null && StringUtils.OrderShopNum())) {
flag = orderList.offer(order);
}
return flag;
}
/**
* 从集合中删除订单
*
* @author grl
* @param orderShopNum机电实习周记
* @return
*/
日记250>老虎卡通
public static boolean remove(String orderShopNum) {
boolean flag = fal;
Order thisOrder = null;
if (StringUtils.isNotBlank(orderShopNum)) {
orderShopNum = im();
for (Order order : orderList) {
String orderNum = OrderShopNum();
if (orderNum.equals(orderShopNum)) {
thisOrder = order;
}
}
if (thisOrder != null) {
flag = ve(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 = im();
for (Order order : orderList) {
String orderNum = OrderShopNum();
if (orderNum.equals(orderShopNum)) {
time = Delay(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 = Logger(CancellOrder.class);
@Override
public void run() {
while (true) {
try {
Order take = OrderCollection().take();
String orderShopNum = OrderShopNum();
int orderType = OrderType();
// 业务逻辑操作
} catch (InterruptedException e) {
e.printStackTrace();
<("CancellOrder DelayQueue 错误 {}", e.getMessage());
}
}
}
}
总结
以上所述是⼩编给⼤家介绍的Java实现商城订单超时取消功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!