利用DelayQueue实现延时消息队列(简易版MQ)
来源:互联网 发布:ilust studio mac 编辑:程序博客网 时间:2024/06/05 03:03
1.上文
关于阻塞队列的介绍:http://blog.csdn.net/caicongyang/article/details/50649897
2.需求
延迟消息队列:
1)2个小时后给用户发送短信。
2)15分钟后关闭网络连接。
3)2分钟后再次尝试回调。
3.案例demo
Message.java
package com.ccy.concurrent;import java.util.concurrent.Delayed;import java.util.concurrent.TimeUnit;/** * <p> * Title: Message.java * Package com.ccy.concurrent * </p> * <p> * Description: 延迟执行的消息 * <p> * @author Tom.Cai * @created 2016-2-10 下午7:39:48 * @version V1.0 * */public class Message implements Delayed{private String id;private String name;private long activeTime;//执行时间 public Message(){}public Message(String id, String name,long activeTime) {super();this.id = id;this.name = name;this.activeTime = TimeUnit.NANOSECONDS.convert(activeTime, TimeUnit.MILLISECONDS) + System.nanoTime();}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int compareTo(Delayed delayed) {Message msg = (Message)delayed;return Integer.valueOf(this.id)>Integer.valueOf(msg.id)?1:( Integer.valueOf(this.id)<Integer.valueOf(msg.id)?-1:0);}@Overridepublic long getDelay(TimeUnit unit) { return unit.convert(this.activeTime - System.nanoTime(), TimeUnit.NANOSECONDS); }}
Producer.javaProducer
package com.ccy.concurrent;import java.util.concurrent.DelayQueue;public class Producer implements Runnable{private DelayQueue<Message> queue;public Producer(DelayQueue<Message> queue){this.queue = queue;}@Overridepublic void run() {//5秒后发送消息Message m2 = new Message("2","Tom",5000);queue.offer(m2);System.out.println("消息生产者往消息队列放置消息:"+m2.getId()+":"+m2.getName());//3秒后发送消息Message m1 = new Message("1","Tom",3000);queue.offer(m1);System.out.println("消息生产者往消息队列放置消息:"+m1.getId()+":"+m1.getName());}}Consumer.java
package com.ccy.concurrent;import java.util.concurrent.DelayQueue;public class Consumer implements Runnable{private DelayQueue<Message> queue;public Consumer(DelayQueue<Message> queue){this.queue = queue;}@Overridepublic void run() {while(true){try {Message take = queue.take();System.out.println("消息需求者获取消息:"+take.getId()+":"+take.getName());} catch (InterruptedException e) {e.printStackTrace();}}}}DelayQueueTest.java
package com.ccy.concurrent;import java.util.concurrent.DelayQueue;public class DelayQueueTest {public static void main(String[] args) {DelayQueue<Message> queue = new DelayQueue<Message>();new Thread(new Producer(queue)).start();new Thread(new Consumer(queue)).start();}}
4.效果
5.其他学习资源
http://zhangyp.net/rabbitmq-delayqueue/
...
6.后记
作者将学习Apache的ActiveMQ消息总线,其可以支持定时、延迟投递、重复投递和Cron调度。
更多多线程精彩内容请继续关注我的博客:http://blog.csdn.net/caicongyang
记录与分享,你我共成长 -from caicongyang
1 0
- 利用DelayQueue实现延时消息队列(简易版MQ)
- 利用DelayQueue实现延时消息队列(简易版MQ)
- 利用DelayQueue实现延时消息队列(简易版MQ)
- delayQueue延时队列-模拟简易MQ
- DelayQueue 实现延时消息队列实践
- DelayQueue延时队列的使用
- DelayQueue延时队列的使用
- DelayQueue延时队列操作实例
- MQ发送延时消息
- 消息队列(MQ)概括
- MQ(消息队列)简介
- DelayQueue实现延迟消息
- 进阶篇:延时队列之DelayQueue(十四)
- MQ消息队列系列(1)为什么使用MQ
- MQ消息队列系列(2)什么时候使用MQ
- MQ消息队列系列(4)MQ原理
- MQ消息队列系列(1)为什么使用MQ
- MQ消息队列系列(2)什么时候使用MQ
- CodeForces 228A Is your horseshoe on the other hoof?
- const
- C语言文件相关操作
- 【博客迁移】博客迁移至www.hanszone.xyz
- Chapter 9-03
- 利用DelayQueue实现延时消息队列(简易版MQ)
- Chapter 9-04
- Chapter 9-05
- java web学习(进阶篇)八 Spring中的事务管理
- Dalvik和JVM的区别
- Android ndk jni log 输出 打印 调试
- Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
- poj2112 Optimal Milking
- linux下安装php7+mysql5.7+nginx