天天看點

RabbitMQ筆記(九)-死信隊列

死信交換機: DLX,dead-letter-exchange

當消息在一個隊列中變成死信 (dead message) 之後,它能被重新 publish 到另一個 隊列

消息變成死信的原因有:

​ 1.消息被拒絕 (basic.reject / basic.nack) 并且 reQueue=false

​ 2.消息 TTL 過期

​ 3.隊列達到最大長度了

死信隊列的使用場景

可以用做定時任務,也可以是存儲逾時消息,比如付費逾時之類的

私信隊列的使用

  1. 直接在管理頁面上建立

首先建立私信交換機demo.dead

RabbitMQ筆記(九)-死信隊列

再建立私信隊列demo.dead

RabbitMQ筆記(九)-死信隊列

綁定隊列和交換器

RabbitMQ筆記(九)-死信隊列

建立業務交換器demo

RabbitMQ筆記(九)-死信隊列

建立業務隊列demo

x-message-ttl: 指定消息逾時時間是10000ms

x-dead-letter-exchange: 指定死信交換器為demo.dead

x-dead-letter-routing-key: 指定死信的routingKey是demo.dead

RabbitMQ筆記(九)-死信隊列

在綁定業務隊列到業務交換器

RabbitMQ筆記(九)-死信隊列
  1. springboot應用中建立
public void createQueue(String topic, String queryName) throws IOException {

        log.info("create queue : {}, {}, {}", topic, queryName);
        RabbitChannelManager.MyChannel channel = rabbitChannelManager.getChannel();
        /* 建立死信隊列 */
        String deadQueueName = addDeadSuffix(queryName);
        String deadRouteKey = addDeadSuffix(topic);
        channel.getChannel().queueDeclare(deadQueueName, true, false, false, null);
        channel.getChannel().queueBind(addDeadSuffix(queryName), rabbitConfiguration.getDeadExchange(), deadRouteKey);

        /* 建立隊列,加入死信轉發參數 */
        Map<String, Object> deadArgs = new HashMap<>();
        deadArgs.put("x-message-ttl", rabbitConfiguration.getDeadMessageTtl());
        deadArgs.put("x-dead-letter-exchange", rabbitConfiguration.getDeadExchange());
        deadArgs.put("x-dead-letter-routing-key", deadRouteKey);
        channel.getChannel().queueDeclare(queryName, true, false, false, deadArgs);
        channel.getChannel().queueBind(queryName, rabbitConfiguration.getDefaultExchange(), topic);

        rabbitChannelManager.returnChannel(channel);

    }           

複制

建立好的隊列清單

RabbitMQ筆記(九)-死信隊列

測試一下

發送一條消息到demo隊列,檢視隊列情況

RabbitMQ筆記(九)-死信隊列

可以看到demo隊列有一條消息

等待一會後再看隊列情況

RabbitMQ筆記(九)-死信隊列

可以看到該消息已經因為逾時而轉發到了demo.dead死信隊列

另外兩種情況也是同樣的結果就不多寫了