订单超时未付款及时删除(伪),一种解决方案

本文介绍了一种通过后台线程定期检查订单状态并取消超时未支付订单的方法。使用Java实现了一个具体的例子,包括创建订单对象存储订单ID和下单时间,并通过线程定时检查订单的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:新下订单10分钟内未付款,则修改订单状态为无效状态


在刚下订单后,将订单放入一个list当中,该list中存放订单对象(该对象可只存放,刚下订单的ID和下单时间),

然后创建一个线程,run()方法中执行遍历list中的订单的下单时间与当前时间对比,如果当前时间减去下单时间大于10分钟,

则根据订单ID,删除该订单,并将list中的该条数据也删除;如果10分钟内付款,则直接在业务层付款的时候从list中删除该订单。而为了使线程循环执行,要用到递归。



首先创建一个Order对象,该对象中存放订单的ID和下单时间:

import java.util.Date;


public class Order {
private Integer orderId;
private Date pastTime;


public Order(){

}

public Order(Integer orderId,Date pastTime){
this.orderId=orderId;
this.pastTime=pastTime;
}


public Integer getOrderId() {
return orderId;
}


public void setOrderId(Integer orderId) {
this.orderId = orderId;
}


public Date getPastTime() {
return pastTime;
}


public void setPastTime(Date pastTime) {
this.pastTime = pastTime;
}


}


然后写一个线程:

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;


import javax.annotation.Resource;


import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;


import com.chifan2.business.dao.OrderMapper;
import com.chifan2.common.util.Order;


@Component("DeleteInvalidOrder") 
public class DeleteInvalidOrder implements ApplicationListener<ContextRefreshedEvent>{
private static List<Order> order = new ArrayList<Order>();


private MyThread myThread;
@Resource
public OrderMapper dao;

public static List<Order> getOrder() {
return order;
}


public static void setOrder(List<Order> order) {
DeleteInvalidOrder.order = order;
}



@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getApplicationContext().getParent()==null){
if (myThread == null) {  
           myThread = new MyThread(dao);  
           myThread.start(); // servlet 上下文初始化时启动 socket   
       }  
}else{
//System.out.println("bb");
}
}

}


//@Component
class MyThread extends Thread{
//@Resource
public OrderMapper dao;
public MyThread(OrderMapper dao){
this.dao=dao;
}
public MyThread(){

}


public void run(){
//System.out.println("aaaaaaa");
HashMap<String,Object> map=new HashMap<String,Object>();
Iterator<Order> it =  DeleteInvalidOrder.getOrder().iterator();
while(it.hasNext()){
Order ord=it.next();
//System.out.println(ord.getOrderId());
//System.out.println(new Date().getTime()-ord.getPastTime().getTime());
if((new Date().getTime()-ord.getPastTime().getTime())>=1000*600){
//System.out.println(ord.getPastTime());
map.put("orderId", ord.getOrderId());
dao.updateOrderStatus(map);
//service.deleteInvalidOrder(ord.getOrderId());
it.remove();
}
}
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
run();
}
}


业务层付款后删除我就不写了,跟run()中的一样。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值