延迟队列DelayQueue简单入门
作者:互联网
一、DelayQueue是什么
DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
二、DelayQueue能做什么
1. 淘宝订单业务:下单之后如果三十分钟之内没有付款就自动取消订单。
2. 饿了吗订餐通知:下单成功后60s之后给用户发送短信通知。
三、实际开发中的应用
简单的延时队列要有三部分:第一实现了Delayed接口的消息体、第二消费消息的消费者、第三存放消息的延时队列
1.消息体。实现接口 Delayed ,重写方法 compareTo 和 getDelay
public class Message implements Delayed{ private Map<String,String> body=new HashMap<>(); //消息内容 private long excuteTime;//执行时间 private String type; public Map<String, String> getBody() { return body; } public void setBody(Map<String, String> body) { this.body = body; } public long getExcuteTime() { return excuteTime; } public void setExcuteTime(long excuteTime) { this.excuteTime = excuteTime; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Message(long delayTime,String type) { this.excuteTime = TimeUnit.NANOSECONDS.convert(delayTime, TimeUnit.MILLISECONDS) + System.nanoTime(); this.type=type; } @Override public int compareTo(Delayed delayed) { long d = (getDelay(TimeUnit.NANOSECONDS) - delayed.getDelay(TimeUnit.NANOSECONDS)); return (d == 0) ? 0 : ((d < 0) ? -1 : 1); } @Override public long getDelay(TimeUnit unit) { return unit.convert(this.excuteTime - System.nanoTime(), TimeUnit.NANOSECONDS); } }
2.声明消费者。实现接口Runnable
public class Consumer implements Runnable { // 延时队列 private DelayQueue<Message> queue; public static boolean isRun=false; public Consumer(DelayQueue<Message> queue) { this.queue = queue; } @Override public void run() { isRun=true; while (true) { try { Message take = queue.take(); System.out.println("消息类型:" + take.getType()); Map<String,String> map=take.getBody(); System.out.println("消息内容:"); for (String key:map.keySet()){ System.out.println("key="+map.get(key)); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
3.延迟队列管理者,用于在任何地方获取 DelayQueue
public class DelayQueueManager { private static DelayQueue<Message> delayQueue=null; static { // 创建延时队列 delayQueue = new DelayQueue<Message>(); } public static DelayQueue<Message> getDelayQueue(){ return delayQueue; } }
4.使用延迟队列发送消息
// 添加延时消息,m1 延时5s Message m1 = new Message( 5000,"订单"); m1.getBody().put("content","12345"); // 添加延时消息,m1 延时5s DelayQueueManager.getDelayQueue().offer(m1); if(!Consumer.isRun){ // 启动消费线程 new Thread(new Consumer(DelayQueueManager.getDelayQueue())).start(); }
以上就是延迟队列delayQueue的简单入门配置和使用,希望对你有帮助!
文章参考:
https://blog.csdn.net/zhu_tianwei/article/details/53549653
标签:入门,队列,延时,DelayQueue,excuteTime,type,public 来源: https://www.cnblogs.com/zouhong/p/14807972.html