96SEO 2026-02-19 11:10 0
问题发现问题解决方法一只监听死信队列在死信队列里面处理业务逻辑方法二修改预取值

“死信”这意味着当以下四个事件中的任何一个发生时这些消息将被重新发布到
之前的文章里面有讲解过TTL过期后不进入死信队列的疑惑和解决办法然后上手去实践另一个死信队列的方法结果又是一道坑等着我示例代码如下
DirectExchange(dead.exchange);}/***
BindingBuilder.bind(deadQueue()).to(deadExchange()).with(dead);}/***
normalQueue.addArgument(x-dead-letter-exchange,
normalQueue.addArgument(x-dead-letter-routing-key,
normalQueue.addArgument(x-max-length,
normalQueue.addArgument(x-overflow,reject-publish);//最近发布的消息将被丢弃
QueueBuilder.durable(normal_queue).deadLetterExchange(dead.exchange).deadLetterRoutingKey(dead).maxLength(5)
DirectExchange(normal.exchange);}/***
BindingBuilder.bind(queue()).to(normalExchange()).with(normal);}
LoggerFactory.getLogger(MQReceiver.class);RabbitHandlerpublic
LoggerFactory.getLogger(MQReceiver2.class);RabbitHandlerpublic
world_i;template.convertAndSend(normal.exchange,
按道理会将队列前面的5条消息进入死信队列然后剩下的五条消息正常消费才对我们检查一下队列是否设置成功如图所示
我们先在页面上向普通队交换机发送10条消息然后查看它的状态如图所示
我们可以看到普通队列存放的是最后5条消息前面的5条消息进入死信队列。
也就是说再没有进入普通消费者之前会将队列前面删除或死信消息进入消费者之前将消息进行分配。
这种做法也是网上大多数文章的一种处理方法另外一种情况就是进入普通消费者还没被消费完的情况下消费者挂了然后队列就会重新分配将从队列前面删除或者进入死信队列如图所示
但是这些做法都是基于没有普通消费者监听的情况下进行的感觉和我理解的略有偏差应该是再有普通消费者监听和死信队列监听的情况下发送消息时会对消息进行分配处理。
发送方代码和配置的代码就不重复展示了参考之前示例监听死信队列自动确认模式和手动确认模式都一样示例代码如下
LoggerFactory.getLogger(MQReceiver2.class);RabbitHandlerpublic
{log.info(死信队列收到消息{},msg);channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);}
再监听普通队列时抛异常或者手动拒绝重新进入队列这两种方式都不能达到我想要的效果我发现只要有普通消费方监听就会进入消费然后我就在想是不是因为预期值的问题导致可能我消息数量太少了然后默认预期值太高导致消息直接进入消费然后将预取值改为1自动确认模式示例代码如下
spring.rabbitmq.listener.simple.prefetch1发送方代码和配置的代码就不重复展示了参考之前示例监听普通队列示例代码如下
LoggerFactory.getLogger(MQReceiver.class);RabbitHandlerpublic
模拟业务处理队列等待场景Thread.sleep(10000);}
LoggerFactory.getLogger(MQReceiver2.class);RabbitHandlerpublic
当然有的时候也不一定完全按照你设置的最大长度进入死信队列有的时候消费速度太快队列的第一个已经被消费了的情况得看实际情况至少可以确保再设置了大于队列最大长度时是可以正常进入死信队列的。
归根结底消息数量太少了。
另外我们再来介绍一下溢出方式一般默认情况下溢出方式为drop-head从队列前面删除或者进入死信队列除此之外还有两种
reject-publish和reject-publish-dlx最近发布的消息将被丢弃。
reject-publish
DirectExchange(dead.exchange);}/***
BindingBuilder.bind(deadQueue()).to(deadExchange()).with(dead);}/***
normalQueue.addArgument(x-dead-letter-exchange,
normalQueue.addArgument(x-dead-letter-routing-key,
normalQueue.addArgument(x-max-length,
normalQueue.addArgument(x-overflow,reject-publish);//最近发布的消息将被丢弃
QueueBuilder.durable(normal_queue).deadLetterExchange(dead.exchange).deadLetterRoutingKey(dead).maxLength(5)
设置队列最大长度为5.overflow(QueueBuilder.Overflow.dropHead).build();}/***
DirectExchange(normal.exchange);}/***
BindingBuilder.bind(queue()).to(normalExchange()).with(normal);}
然后我们再来看看将溢出模式设置为reject-publish-dlxQueueBuilder.Overflow没有该参数手动定义示例代码如下
Queue(normal_queue);normalQueue.addArgument(x-dead-letter-exchange,
死信队列normalQueue.addArgument(x-dead-letter-routing-key,
死信队列routingKeynormalQueue.addArgument(x-max-length,
5);//设置队列最大长度normalQueue.addArgument(x-overflow,reject-publish-dlx);
normalQueue;}//忽略普通队列创建过程参考前面示例...
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback