首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-27 
订单队列处理及按时间队列处理前段时间一同事在做一个订单的自动取消功能,他是用一个timertask做的,每个多

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

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

上面的代码还有未测试的,欢迎大家拍砖指点!!谢谢 1 楼 午夜流浪 2012-06-27   timertask 浪费资源,线程就不浪费吗 2 楼 jicu7766240 2012-06-27   午夜流浪 写道timertask 浪费资源,线程就不浪费吗
他的处理方式是每隔一段时间去检查数据是否存在需要取消的订单,不是这种存在内存中,目前我写的这种可以比较及时的处理到可以取消的订单,比timertask可以更多的节省CPU时间,他睡眠的时间控制的精确些,只是还有个问题,就是这个控制到毫秒不是精确到0,如果能精确到0毫秒的来处理的话,我想应该就还算可以了。 3 楼 jasspier 2012-06-27   放在内存里考虑过断电之类的情况吗?
生成订单的时候直接加个属性就是过期时间不好吗? 4 楼 jicu7766240 2012-06-27   jasspier 写道放在内存里考虑过断电之类的情况吗?
生成订单的时候直接加个属性就是过期时间不好吗?
断电不在我的考虑范围内哟,如果真要考虑这种,那就是需要多写一些代码,例如程序启动时自动加入到队列中,加过期时间的话不是不好,因为库存啊什么的需要能及时处理的就及时处理,有些商品的库存本来就不多,

热点排行