问题是这样的,在程序里创建了延时队列,创建之后在页面随便点个查询按钮,mq 死信队列消息离奇失踪,不点页面的查询按钮则无事,图如下所示,希望大师帮我看看,公司项目,急!!
延时队列使用redis实现了。。
建议如下角度排查:
1.消息是否会持久化到磁盘
2.是否是有时限的消息
3.是否有没有发现的消费端在消费消息,按照项目经验,这个概率很高
4.建议同步检测一下rabbitmq的日志信息
消息应答就是:消费者在接收到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了,rabbitmq 可以把该消息删除了。防止队列到消费者的消息丢失
。
此处有可能因为网络问题导致Ack失败,那么Client会重复消息,这里就引出消费幂等的问题;
自动应答,默认策略,autoAck = true
手动应答:设置手动应答,autoAck = false
channel.basicNack()
(用于否定确认),三个参数channel.basicReject()
(用于否定确认),两个参数channel.basicConsume(QUEUE_NAME,false,
(consumerTag, message) -> {
// 接收到的消息
String receviedMessage = new String(message.getBody());
System.out.println("消费者接收到的消息:"+receviedMessage);
/**
* 确认应答
* 1.哪个消息
* 2.应答一个消息还是应答一个消息
* true: 把当前消息和之前的消息一起应答
* false: 只应答当前消息
*/
// channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
/**
* 拒绝 确认受到应答
* 1.哪个消息
* 2.应答一个消息还是应答一个消息
* true: 把当前消息和之前的消息一起拒绝
* false: 只拒绝当前消息
* 3.是否重新入队
* true: 消息重新入队
* false: 丢弃消息 或者 进入死信队列(死信队列需要配置)
*/
// channel.basicNack(message.getEnvelope().getDeliveryTag(),false,false);
/**
* 拒绝 确认受到应答
* 1.哪个消息
* 2.是否重新入队
* true: 消息重新入队
* false: 丢弃消息 或者 进入死信队列(死信队列需要配置)
*/
channel.basicReject(message.getEnvelope().getDeliveryTag(),false);
},
(consumerTag) -> {
System.out.println("消费失败");
});