`
jicu7766240
  • 浏览: 17402 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

前段时间一同事在做一个订单的自动取消功能,他是用一个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
2
分享到:
评论
4 楼 jicu7766240 2012-06-27  
jasspier 写道
放在内存里考虑过断电之类的情况吗?
生成订单的时候直接加个属性就是过期时间不好吗?

断电不在我的考虑范围内哟,如果真要考虑这种,那就是需要多写一些代码,例如程序启动时自动加入到队列中,加过期时间的话不是不好,因为库存啊什么的需要能及时处理的就及时处理,有些商品的库存本来就不多,
3 楼 jasspier 2012-06-27  
放在内存里考虑过断电之类的情况吗?
生成订单的时候直接加个属性就是过期时间不好吗?
2 楼 jicu7766240 2012-06-27  
午夜流浪 写道
timertask 浪费资源,线程就不浪费吗

他的处理方式是每隔一段时间去检查数据是否存在需要取消的订单,不是这种存在内存中,目前我写的这种可以比较及时的处理到可以取消的订单,比timertask可以更多的节省CPU时间,他睡眠的时间控制的精确些,只是还有个问题,就是这个控制到毫秒不是精确到0,如果能精确到0毫秒的来处理的话,我想应该就还算可以了。
1 楼 午夜流浪 2012-06-27  
timertask 浪费资源,线程就不浪费吗

相关推荐

    DelayQueue延迟队列和Redis缓存实现订单自动取消功能

    在Java编程中,DelayQueue是一种特殊的并发队列,它遵循先进先出(FIFO)原则,但具有一个独特的特性:元素只有在其指定的延迟时间过去之后才能被获取和处理。这个特性使得DelayQueue成为实现定时任务和延迟操作的...

    消息队列处理,常用于队列任务的处理

    在标题和描述中提到的“消息队列处理”和“队列任务”,涉及的核心概念主要包括消息传递、任务调度以及异步处理。 1. **消息传递**:消息队列基于发布/订阅或生产者/消费者模型,允许不同服务之间通过消息进行通信...

    PHP消息队列实现及应用详解【队列处理订单系统和配送系统】

    消息队列是一种队列结构的中间件,它的核心思想是将需要处理的任务放入队列中,然后由消费者按顺序地取出并执行。这样,生产者(即添加任务的系统)无需等待任务的执行结果,即可快速响应,从而减轻系统的即时压力。...

    【ASP.NET编程知识】运用.NetCore实例讲解RabbitMQ死信队列,延时队列.docx

    例如,在处理订单时,我们可以将订单信息发送到延时队列,然后在某个特定的时间点进行处理。 三、延时消息设置不同过期时间 在RabbitMQ中,我们可以设置消息的过期时间,然后在该时间点将消息发送到延时队列。在...

    Thinkphp6实现队列代码

    本教程将深入探讨如何在ThinkPHP6中实现队列代码,这在处理异步任务、批量操作或延时任务时非常有用,如取消未支付订单、超时订单以及超时收货订单等。 首先,理解队列的基本概念非常重要。队列是一种先进先出...

    PHP消息队列实现及应用.txt

    第2章 解耦案例:队列处理订单系统和配送系统 讲解消息队列用于解耦的案例,使用mysql的一个表,做为队列存储,来实现成中间件来解耦订单系统和配送系统。使用订单系统实时写入,并用定时任务启动配送系统的处理程序...

    高效延时队列的设计与实现

    延时队列是一种特殊的消息队列,它具有延时功能,使得消息在生产者发布后不会立即被消费,而是会在预设的延时时间过后才被处理。这种机制在很多业务场景中非常有用,如订单处理、定时提醒、定时发布等。 实现高效...

    004 死信队列实现订单超时过期支付失败

    在IT行业中,尤其是在分布式系统和消息中间件的领域,死信队列(Dead Letter Queue, DLQ)是一个非常重要的概念,特别是在处理订单超时或支付失败这类业务场景中。这里我们将详细探讨“004 死信队列实现订单超时过期...

    17-消息队列:秒杀时如何处理每秒上万次的下单请求?_For_group_share1

    后台启动多个队列处理程序,它们按照一定的节奏消费消息队列中的请求,这样就能控制并发写入数据库的请求数量,避免了瞬间的高并发对数据库的冲击。一旦库存耗尽,消息队列中的后续请求可以被丢弃,从而实现了削峰...

    RabbitMQ死信队列应用1

    使用定时任务轮询可能会有时间精度不高的问题,而通过延迟消息队列,可以确保在准确的时间点触发处理,减轻系统压力。 - **异常处理**:当消费者处理消息时出现异常,消息可以被定向到DLX,然后由专门的处理程序...

    web队列源码,支持多个浏览器

    3. **订单的出队及处理**:后台线程或者工作进程定期检查队列,将队首的订单取出进行处理,如数据库操作、业务逻辑计算等。 4. **并发控制**:为了保证多浏览器请求的安全性,源码中可能会有锁或者其他并发控制机制...

    分布式架构之消息队列.pdf

    消息队列作为分布式系统中的关键组件,其主要功能是降低应用间的耦合度,实现异步处理,以及流量控制。它能帮助构建高性能、高可用和可扩展的系统,确保最终一致性。在实际生产环境中,常见的消息队列中间件有...

    Go-delay-queue基于Redis实现的延迟队列

    在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时任务、订单超时、通知发送等场景非常有用。本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计...

    springboot+rabbitmq实现延时队列

    在IT行业中,延时队列是一种非常实用的技术,它允许我们推迟消息的处理,直到某个特定的时间点。这种机制在很多场景下都是必不可少的,比如订单超时处理、定时任务调度、延迟通知等。本教程将详细介绍如何使用...

    使用RabbitMQ+延迟队列实现分布式事务的最终一致性方案

    在订单+库存系统的场景下,当用户下单时,我们首先将订单创建的信息发送到RabbitMQ的延迟队列,设置延迟时间如30秒。这样做的目的是让订单先创建成功,保证用户端的快速响应,而库存的扣减则延后执行。 接下来,...

    Spring Boot集成Redisson实现延迟队列

    采用的是多线程来处理延迟队列的,在设计延迟任务时,我们应该根据实际需求来合理设置延迟时间,避免设置过长的延迟时间导致内存占用过高。 在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔...

    ASP_NET在消息队列中的应用

    在这个场景中,我们可以创建一个名为`OrderQueue`的消息队列,并将订单信息作为消息发送到该队列中。后端服务可以监听这个队列,一旦检测到新消息,就进行相应的处理。这种方式不仅简化了前端与后端的交互,也增强了...

    Node.js-基于kue的egg延时队列

    总结来说,通过将Kue的延时队列功能与Egg.js框架结合,我们可以构建出一个高效、可靠的后台任务处理系统,这在需要定时执行或按顺序处理任务的场景下显得尤为重要。了解并熟练掌握这一技术,对于提升Node.js应用的...

    京东技术开放日第一期-电商海量订单处理OFC系统的关键技术环节

    此外,运营工具必须能够支持订单的手工处理、订单优先级调整,以及客户预约时间和生产计划的调整。 系统的架构采用了分布式任务处理引擎、任务队列引擎、生产数据中心,以及系统配置管理等关键组件。分布式系统的...

    互联网延迟队列解决方案设计.pdf

    互联网延迟队列是指在分布式系统中,为了满足某些业务场景需要,如订单延迟关闭、自动评价、会员系统管理等,对消息进行一定时间的延迟后才进行处理的队列机制。互联网延迟队列的解决方案设计对于保障业务逻辑的准确...

Global site tag (gtag.js) - Google Analytics