前段时间一同事在做一个订单的自动取消功能,他是用一个timertask做的,每个多少分钟自动跑一次,我觉得那样不大好,多浪费资源的,然后就参考游戏的一个技能冷却做了一个简单的例子,我技术有限,欢迎大家拍砖指点下。
流程是:下单成功后,24小时未付款自动取消订单。
处理流程:当下单成功,将当前订单的相关属性添加到队列,然后一个线程不断的轮询当前队列中是否有需要取消的订单。然后可以根据订单编号来取消当前队列中的数据。
好了。直接上代码:
queue类:
import java.util.LinkedList;
/**
* 队列数据
* @author 小俊不乖
*
*/
public class Queue {
/**
* 订单数据队列
*/
private LinkedList<OrderPOJO> orderQueue = new LinkedList<OrderPOJO>();
/**
* 添加一个数据到队列
* @param orderPOJO
*/
public synchronized void addQueue(OrderPOJO orderPOJO){
orderQueue.add(orderPOJO);
}
/**
* 获取队列中最后一个对象
*/
@SuppressWarnings("unchecked")
public <T> T getQueueLastObject(){
return (T)orderQueue.peekFirst();
}
/**
* 根据订单编号移除一个已存在队列中的数据
* @param orderNo
*/
public synchronized void removeObjectByOrderNo(String orderNo){
OrderPOJO orderPOJO = new OrderPOJO();
orderPOJO.setOrderNo(orderNo);
int index = orderQueue.indexOf(orderPOJO);
orderQueue.remove(index);
}
}
orderPojo类:
import java.io.Serializable;
import java.util.Date;
/**
* 数据实体
* @author 小俊不乖
*
*/
public class OrderPOJO implements Serializable{
private static final long serialVersionUID = 8126155000510758759L;
private String orderNo; //订单编号
private Date createTime; //下单时间
public OrderPOJO() {
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public boolean equals(Object obj) {
OrderPOJO orderPOJO = (OrderPOJO)obj;
return this.orderNo.equals(orderPOJO.getOrderNo());
}
}
测试类:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
final Queue queue = new Queue();
OrderPOJO orderPOJO1 = new OrderPOJO();
Date time = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(time);
calendar.add(Calendar.SECOND, 10);
orderPOJO1.setOrderNo("1");
orderPOJO1.setCreateTime(calendar.getTime());
OrderPOJO orderPOJO2 = new OrderPOJO();
orderPOJO2.setOrderNo("2");
calendar.add(Calendar.SECOND, 20);
orderPOJO2.setCreateTime(calendar.getTime());
queue.addQueue(orderPOJO1);
queue.addQueue(orderPOJO2);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(true){
OrderPOJO orderPOJO = queue.getQueueLastObject();
if(orderPOJO == null){
System.out.println("没得,数据了,等待加入数据");
Thread.currentThread().suspend();
continue;
}
long time = orderPOJO.getCreateTime().getTime() - System.currentTimeMillis();
System.out.println("订单编号:" + orderPOJO.getOrderNo() + ",到期时间:" +
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(orderPOJO.getCreateTime().getTime())
+ ",当前线程需要睡眠" + time + "毫秒");
if(time < 1){
System.out.println("当前可以执行的数据订单编号:" + orderPOJO.getOrderNo());
queue.removeObjectByOrderNo(orderPOJO.getOrderNo());
}else{
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
t.setName("执行队列的后台线程");
t.start();
long l = 40*1000;
try {
Thread.currentThread().sleep(l);
} catch (InterruptedException e) {
e.printStackTrace();
}
OrderPOJO orderPOJO3 = new OrderPOJO();
orderPOJO3.setOrderNo("3");
calendar.add(Calendar.SECOND, 30);
orderPOJO3.setCreateTime(calendar.getTime());
System.out.println("加入数据,开始执行");
queue.addQueue(orderPOJO3);
t.resume();
}
}
上面的代码还有未测试的,欢迎大家拍砖指点!!谢谢