2019独角兽企业重金招聘Python工程师标准>>>
一、DelayQueue是什么
DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。
二、DelayQueue能做什么
1. 淘宝订单业务:下单之后如果三十分钟之内没有付款就自动取消订单。
2. 饿了吗订餐通知:下单成功后60s之后给用户发送短信通知。
三、实际开发中的应用
简单的延时队列要有三部分:第一实现了Delayed接口的消息体、第二消费消息的消费者、第三存放消息的延时队列
1.消息体。实现接口 Delayed ,重写方法 compareTo 和 getDelay
public class Message implements Delayed{
private Map body=new HashMap<>(); //消息内容
private long excuteTime;//执行时间
private String type;
public Map getBody() {
return body;
}
public void setBody(Map 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 queue;
public static boolean isRun=false;
public Consumer(DelayQueue queue) {
this.queue = queue;
}
@Override
public void run() {
isRun=true;
while (true) {
try {
Message take = queue.take();
System.out.println("消息类型:" + take.getType());
Map 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 delayQueue=null;
static {
// 创建延时队列
delayQueue = new DelayQueue();
}
public static DelayQueue 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