订单队列处理及按时间队列处理

前段时间一同事在做一个订单的自动取消功能,他是用一个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();
}

}


上面的代码还有未测试的,欢迎大家拍砖指点!!谢谢
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值