RabbitMq之死信队列之消息过期

死信队列形成条件:
1.消息被拒绝
2.消息TTL过期
3.队列达到最大长度

下面演示的是死信队列在消息TTL过期后会自动发送到对应路由的消息队列中(注意:是对应路由)

package rab.dtl;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import rab.util.ConnectionUril;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

public class Proce {
    static final String DIRECT_EXCHANGE="dir_exchange";
    static final String DIRECT_QUEUE_insert="dirt_queue_insert";
    public static void main(String[] args) throws IOException, TimeoutException {


        Connection connection = ConnectionUril.getConnection();
        //创建频道
        Channel channel = connection.createChannel();
        /**
         * 生命交换机
         *  参数1:交换机名称
         *  参数2:交换机类型  fanout,topic,direct,handers
         */
        channel.exchangeDeclare(DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT);
        Map dtl=new HashMap<>();
        //死信队列设置
        String dlxExchange="dlx.exchange";
        String dlsQueue="dlx.queue";
        String dlxRoutingKey="item.dtl";
        //为队列设置队列交换器
        dtl.put("x-dead-letter-exchange",dlxExchange);
        //设置队列中的消息10s过其
        dtl.put("x-message-ttl", 10000);
        //创建队列
        /**
         * 参数1:队列名称
         * 阐述2:是否定义持久化队列
         * 参数3:是否独占本次队列
         * 参数4:是否在不适用的时候自动删除队列
         * 参数5:队列其他参数
         */
        channel.queueDeclare(DIRECT_QUEUE_insert,true, false,false,dtl);
        //队列绑定交换机
        /**
         * 参数1:队列名
         * 参数2:交换器
         * 参数3:路由器
         */
        channel.queueBind(DIRECT_QUEUE_insert,DIRECT_EXCHANGE,"item.dtl");
        //声明和绑定死信交换器和队列
        channel.exchangeDeclare(dlxExchange, "topic", true, false, null);
        channel.queueDeclare(dlsQueue, true, false, false, null);
        channel.queueBind(dlsQueue, dlxExchange, dlxRoutingKey);


        String message="死信队列,routing为insert";
        /**
         * 参数一:路由器
         * 参数二:指定路由
         * 参数三:不是很懂
         * 参数四:发送的消息字节
         */
        channel.basicPublish(DIRECT_EXCHANGE,"item.dtl",null,message.getBytes());
        System.out.println("已发送消息insert"+message);

        //释放资源
        channel.close();
        connection.close();
    }
}

RabbitMq之死信队列之消息过期_第1张图片
RabbitMq之死信队列之消息过期_第2张图片

为什么我的会发送到指定的队列,你可以看一下我的代码,在我的声明和绑定死信交换队列 上,我绑定的 路由和我,发送消息时的指定路由时一样的,如果改变发送消息的指定路由,那么他就不会发送到我指定的死信队列中。

你可能感兴趣的:(RabbitMq之死信队列之消息过期)