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 @   flypiggg  阅读(27)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示