最近在实现一个业务,就是需要做到消息延迟推送,在Java 多线程并发开发过程中,了解到DelayQueue类的:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。然后再开一个扫描线程去轮询,就可以实现延迟消息的处理了,但是这样子做有一个弊端,就是得开一个线程时刻轮询,比较好资源,于是就寻找到了另外一种解决方案,现在就开始做下记录分享
解决方案就是RabbitMQ + rabbitmq_delayed_message_exchange插件(这种解决方案的好处还有就是可以解决队列先进先出的情况,比如第一个进到队列的到期时间是30分钟,第二个进入队列的到期时间是20分钟,但是由于队列的先进先出原则,第二个进入的会被阻塞了,等到第一个到期了才会被一起延迟处理)
- 安装erlang环境以及rabbitmq(这一步网上教程很多,跳过)
- 下载rabbitmq_delayed_message_exchange,官网地址 https://www.rabbitmq.com/community-plugins.htm
- 先解压,然后放置到rabbitmq安装的路径下的plugins文件夹中