订单超时未付款及时删除(伪),一种解决方案
背景:新下订单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()中的一样。
