09 死信实战

生产者代码

/**
 * 死信队列   生产者
 */
public class Producer {

    //普通交换机
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtils.getChannel();

        //死信消息  设置 ttl时间  单位 ms
        AMQP.BasicProperties properties = new AMQP.BasicProperties()
                .builder().expiration("10000").build();

        for (int i = 0; i < 11; i++) {
            String message = "info" + i;
            channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",null,message.getBytes());
        }
    }
}

消费者 C1 代码(启动之后关闭该消费者 模拟其接收不到消息)

public class Consumer01 {

    //普通交换机
    public static final String NORMAL_EXCHANGE = "normal_exchange";
    //死信交换机
    public static final String DEAD_EXCHANGE = "dead_exchange";
    //普通队列
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtils.getChannel();

        //声明死信 和 普通交换机  类型为 direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明 普通队列
        // 参数:arguments:
        Map<String,Object> arguments = new HashMap<String,Object>();
        //过期时间  不设置  让生产者设置
        //put("x-message-ttl",100000);
        //正常队列 设置 死信交换机是谁
        arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);
        //设置死信 routingKey
        arguments.put("x-dead-letter-routingKey","lisi");
        channel.queueDeclare(NORMAL_QUEUE,false,false,false,null);
        //死信队列
        channel.queueDeclare(DEAD_QUEUE,false,false,false,null);

        //绑定 普通交换机 与 普通队列
        channel.queueBind(NORMAL_QUEUE,NORMAL_EXCHANGE,"zhangsan");
        channel.queueBind(DEAD_QUEUE,DEAD_EXCHANGE,"lisi");

        System.out.println("等待接收消息.....");

        DeliverCallback deliverCallback = (consumerTag, message)->{
            System.out.println("Consumer01"+"接收的消息"+new String(message.getBody(),"uTF-8") );
        };

        channel.basicConsume(NORMAL_QUEUE,true,deliverCallback,consumerTag -> {});
    }

}

队列达到最大长度

  1. 消息生产者代码去掉 TTL 属性
public class Producer {

    //普通交换机
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtils.getChannel();
        //演示队列个数演示
        for (int i = 0; i < 11; i++) {
            String message = "info" + i;
            channel.basicPublish(NORMAL_EXCHANGE,"zhangsan",null,message.getBytes());
        }
    }
}
  1. C1 消费者修改以下代码(启动之后关闭该消费者 模拟其接收不到消息)
 //声明 普通队列
        // 参数:arguments:
        Map<String,Object> arguments = new HashMap<String,Object>();
        //过期时间  不设置  让生产者设置
        //put("x-message-ttl",100000);
        //正常队列 设置 死信交换机是谁
        arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);
        //设置死信 routingKey
        arguments.put("x-dead-letter-routingKey","lisi");
        //设置正常队列的长度限制
        arguments.put("x-max-length",6);

消息被拒

1.消息生产者代码同上生产者一致
2.C1 消费者代码(启动之后关闭该消费者 模拟其接收不到消息)

public class Consumer01 {

    //普通交换机
    public static final String NORMAL_EXCHANGE = "normal_exchange";
    //死信交换机
    public static final String DEAD_EXCHANGE = "dead_exchange";
    //普通队列
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMQUtils.getChannel();

        //声明死信 和 普通交换机  类型为 direct
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明 普通队列
        // 参数:arguments:
        Map<String,Object> arguments = new HashMap<String,Object>();
        //过期时间  不设置  让生产者设置
        //put("x-message-ttl",100000);
        //正常队列 设置 死信交换机是谁
        arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);
        //设置死信 routingKey
        arguments.put("x-dead-letter-routingKey","lisi");
        //设置正常队列的长度限制
        arguments.put("x-max-length",6);
        channel.queueDeclare(NORMAL_QUEUE,false,false,false,null);
        //死信队列
        channel.queueDeclare(DEAD_QUEUE,false,false,false,null);

        //绑定 普通交换机 与 普通队列
        channel.queueBind(NORMAL_QUEUE,NORMAL_EXCHANGE,"zhangsan");
        channel.queueBind(DEAD_QUEUE,DEAD_EXCHANGE,"lisi");

        System.out.println("等待接收消息.....");

        DeliverCallback deliverCallback = (consumerTag, message)->{
            String msg = new String(message.getBody(), "uTF-8");
            if (msg.equals("info5")){
                System.out.println("Consumer01"+"接收的消息"+msg+"此消息是被C1拒绝的");
                channel.basicReject(message.getEnvelope().getDeliveryTag(),false);
            }
            System.out.println("Consumer01"+"接收的消息"+msg);
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };

        channel.basicConsume(NORMAL_QUEUE,true,deliverCallback,consumerTag -> {});
    }
}
posted @ 2021-11-28 19:26  flypiggg  阅读(33)  评论(0)    收藏  举报