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 -> {});
}
}
队列达到最大长度
- 消息生产者代码去掉 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());
}
}
}
- 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 -> {});
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)