RabbitMQ实现死信队列/延迟队列/优先级队列

1 死信队列 / 延迟队列

        死信队列指的是因为某些原因,队列中的某些消息变成了死信(dead letter)后,它们被重新路由到死信交换器(DLX)绑定的队列上,该队列即为死信队列。我们可以监听该死信队列中的消息,以进行相应的处理。

        消息变为死信的原因一般有以下三种:

  • 消息被拒绝,并且设置requeue参数为false
  • 消息过期
  • 队列达到最大长度

1.1 生产者代码

        以下代码是通过“x-message-ttl”和“x-dead-letter-exchange”参数来模拟实现消息过期的效果:当消息发布10秒后,消息从原来的普通队列进入到死信队列中,消费者订阅死信队列,并从中拿出相应的消息。

package com.hys.rabbitmq;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

/**
 * 死信队列生产者
 * @author Robert Hou
 * @date 2019年6月3日
 */
public class DlqProducer {

    private static final String IP_ADDRESS = "127.0.0.1";
    private static final int    PORT       = 5672;

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(IP_ADDRESS);
        factory.setPort(PORT);
        factory.setUsername("root");
        factory.setPassword("root");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare("dlx", "direct", true);
        channel.exchangeDeclare("normalExchange", "fanout", true);
        Map argsMap = new HashMap<>();
        //设置过期时间为10秒
        argsMap.put("x-message-ttl", 10000);
        //设置死信交换器为"dlx"
        argsMap.put("x-dead-letter-exchange", "dlx");
        //指定DLX的路由键为"routingKey"
        argsMap.put("x-dead-letter-routing-key", "routingKey");
        //为普通队列添加DLX
        channel.queueDeclare("normalQueue", true, false, false, argsMap);
        channel.queueBind("normalQueue", "normalExchange", "");
        //创建死信队列及绑定DLX
        channel.queueDeclare("dlQueue", true, fals

你可能感兴趣的:(RabbitMQ,RabbitMQ,死信队列,延迟队列,优先级队列)