背景:新下订单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()中的一样。