1、死信概念
无法被消费的消息
2、死信的来源
1)消息TTL过期;
2)队列达到最大长度;
3)消息被拒绝,且requeue=false
3、死信的实现
3.1、创建交换机
//创建交换机
channel.exchangeDeclare(NOR_EXCHANGE, BuiltinExchangeType.DIRECT);
channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
3.2、创建队列
//声明普通队列
Map<String,Object> arguments = new HashMap<>();
//过期时间10s=10000ms
//arguments.put("x-message-ttl",10000);
//正常队列设置死信交换机
arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);
//设置死信RoutingKey
arguments.put("x-dead-letter-routing-key","lisi"); channel.queueDeclare(NOR_QUEUE,false,false,false,arguments);
//声明死信队列
channel.queueDeclare(DEAD_QUEUE,false,false,false,null);
3.3、交换机与队列绑定
//绑定普通交换机与普通队列
channel.queueBind(NOR_QUEUE,NOR_EXCHANGE,"zhangsan");
//绑定普通交换机与普通队列
channel.queueBind(DEAD_QUEUE,DEAD_EXCHANGE,"lisi");
3.4、死信设置TTL时间
//死信消息 设置TTL时间 单位ms
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
3.5、死信队列接收消息
channel.basicConsume(DEAD_QUEUE,true,deliverCallback,cancelCallback);