【干货】RabbitMQ 延时消息的实现(下)

在RabbitMQ 3.5.7及以后的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延时队列功能。同时插件依赖Erlang/OPT 18.0及以上。

插件源码地址:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

插件下载地址:

https://bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange

1、进入插件目录

whereis rabbitmq

cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins

2、下载插件

wget

https://bintray.com/rabbitmq/community-plugins/download_file?file_path=rabbitmq_delayed_message_exchange-0.0.1.ez

如果下载的文件名带问号则需要改名,例如:

mv download_file?file_path=rabbitmq_delayed_message_exchange-0.0.1.ez rabbitmq_delayed_message_exchange-0.0.1.ez

3、启用插件

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

4、停用插件

rabbitmq-plugins disable rabbitmq_delayed_message_exchange

5、插件使用

通过声明一个x-delayed-message类型的exchange来使用delayed-messaging特性。x-delayed-message是插件提供的类型,并不是rabbitmq本身的(区别于direct、topic、fanout、headers)。

代 码

消费者(先启动):

// 声明x-delayed-message类型的exchange
Map<String, Object> argss = new HashMap<String, Object>();
argss.put("x-delayed-type", "direct");
channel.exchangeDeclare("DELAY_EXCHANGE", "x-delayed-message", false,
 false, argss);

// 声明队列
channel.queueDeclare("DELAY_QUEUE", false,false,false,null);

// 绑定交换机与队列
channel.queueBind("DELAY_QUEUE", "DELAY_EXCHANGE", "DELAY_KEY");

// 创建消费者
Consumer consumer = new DefaultConsumer(channel) {
 @Override
 public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
 byte[] body) throws IOException {
 String msg = new String(body, "UTF-8");
 SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
 System.out.println("收到消息:[" + msg + "]\n接收时间:" +sf.format(newDate()));
 }
};

// 开始获取消息
channel.basicConsume("DELAY_QUEUE", true, consumer);

生产者(后启动):

// 延时投递,比如延时1分钟

Date now = new Date();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, +1);// 1分钟后投递
Date delayTime = calendar.getTime();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String msg = "发送时间:" + sf.format(now) + ",投递时间:" + sf.format(delayTime);

// 延迟的间隔时间,目标时刻减去当前时刻
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("x-delay", delayTime.getTime() - now.getTime());

AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder()
 .headers(headers);

channel.basicPublish("DELAY_EXCHANGE", "DELAY_KEY", props.build(),
 msg.getBytes());

channel.close();
conn.close();

在这里插入图片描述
欢迎加入Java进阶架构交流:加入142019080。

直接点击链接加群。https://jq.qq.com/?_wv=1027&k=5lXBNZ7 获取最新学习资料

猜你喜欢

转载自blog.csdn.net/qq_39662660/article/details/88359012