千家信息网

什么是SimpleMessageListenerContainer和DirectMessageListenerContainer

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"什么是SimpleMessageListenerContainer和DirectMessageListenerContainer",在日常操作中,相信很多人在什么是SimpleMes
千家信息网最后更新 2026年11月03日什么是SimpleMessageListenerContainer和DirectMessageListenerContainer

这篇文章主要介绍"什么是SimpleMessageListenerContainer和DirectMessageListenerContainer",在日常操作中,相信很多人在什么是SimpleMessageListenerContainer和DirectMessageListenerContainer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"什么是SimpleMessageListenerContainer和DirectMessageListenerContainer"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

RabbitMQ 消费者代码开发过程中会使用到 SimpleMessageListenerContainer 和 DirectMessageListenerContainer。
在版本2.0之前的版本中,只有一种MessageListenerContainer 即 SimpleMessageListenerContainer; 2.0之后有第二个容器-DirectMessageListenerContainer

一、SimpleMessageListenerContainer

默认情况下,侦听器容器将启动单个使用者,该使用者将从队列接收消息。根据之前的文档,我们知道有许多控制并发性的属性。
最简单的是concurrentConsumers,它只创建(固定的)将并发处理消息的使用者数量。
此外,还添加了一个新的属性 maxConcurrentConsumers,容器将根据工作负载动态调整并发性。这与四个附加属性一起工作:continutiveactivetrigger、startConsumerMinInterval、continutiveidletrigger、stopConsumerMinInterval。

1.1、在默认设置下,增加消费者的算法工作如下

如果尚未到达maxConcurrentConsumers,并且已有的使用者连续10个周期处于活动状态,并且自上一个使用者启动以来至少已经过了10秒,那么将启动一个新的使用者。如果使用者在txSize *中接收到至少一条消息,则认为该使用者处于活动状态。

1.2、在默认设置下,减少消费者的算法工作如下

如果有多个concurrentConsumers正在运行,并且某个consumer检测到10个连续超时(空闲),并且上一个consumer至少在60秒之前停止,那么该consumer将停止。超时取决于receiveTimeout和txSize属性。如果使用者在txSize *中没有接收到任何消息,则认为它是空闲的。因此,在默认超时(1秒)和txSize为4的情况下,在40秒的空闲时间(4个超时对应1个空闲检测)之后将考虑停止使用者。

1.3、配置如下
@Beanpublic SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory){    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();    factory.setConnectionFactory(connectionFactory);    //初始化消费者数量    factory.setConcurrentConsumers(this.concurrentConsumers);    //最大消费者数量    factory.setMaxConcurrentConsumers(this.maxConcurrentConsumers);    //手动确认消息    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);    factory.setErrorHandler(rabbitErrorHandler);    return factory;}

二、DirectMessageListenerContainer

使用 DirectMessageListenerContainer,您需要确保 ConnectionFactory 配置了一个任务执行器,该执行器在使用该 ConnectionFactory 的所有侦听器容器中具有足够的线程来支持所需的并发性。默认连接池大小仅为5。
并发性基于配置的队列和consumersPerQueue。每个队列的每个使用者使用一个单独的通道,并发性由rabbit客户端库控制;默认情况下,它使用5个线程池;您可以配置taskExecutor来提供所需的最大并发性。

2.1、配置如下
@Beanpublic DirectRabbitListenerContainerFactory directRabbitListenerContainerFactory(ConnectionFactory connectionFactory){    DirectRabbitListenerContainerFactory factory = new DirectRabbitListenerContainerFactory();    factory.setConnectionFactory(connectionFactory);    //每个队列的消费者数量    factory.setConsumersPerQueue(this.consumersPerQueue);    //手动确认消息    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);    factory.setErrorHandler(rabbitErrorHandler);    return factory;}

三、服务对比

SimpleMessageListenerContainer提供了以下特性,但DirectMessageListenerContainer不提供:

  1. txSize-使用SimpleMessageListenerContainer,您可以将其设置为控制事务中传递的消息数量和/或减少ack的数量,但这可能会导致失败后重复传递的数量增加。(与txSize和SimpleMessageListenerContainer一样,DirectMessageListenerContainer也有mesagesPerAck,可以用来减少ack,但不能用于事务-每个消息都在单独的事务中交付和打包)。

  2. maxconcurrentconsumer和consumer伸缩间隔/触发器-DirectMessageListenerContainer中没有自动伸缩;但是,它允许您以编程方式更改consumersPerQueue属性,并相应地调整使用者。

然而,与SimpleMessageListenerContainer相比,DirectMessageListenerContainer有以下优点:

  1. 在运行时添加和删除队列更有效;使用SimpleMessageListenerContainer,整个使用者线程重新启动(所有使用者取消并重新创建);对于DirectMessageListenerContainer,不受影响的使用者不会被取消。

  2. 避免了RabbitMQ客户机线程和使用者线程之间的上下文切换。

  3. 线程是跨使用者共享的,而不是为SimpleMessageListenerContainer中的每个使用者都有一个专用线程。

到此,关于"什么是SimpleMessageListenerContainer和DirectMessageListenerContainer"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

使用者 消息 数量 线程 消费者 消费 属性 队列 配置 容器 空闲 学习 工作 事务 情况 控制 最大 侦听器 客户 手动 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 互联网金融 金融科技 亿策互联网科技 大白互联网科技 互联网科技公司做什么 互联网金融监管科技 昭通云南众福互联网科技有限公司 阿里互联网科技公司 互联网校园科技培训 厦门千工互联网科技有限公司 阿大互联网科技有限公司 广西互联网科技孵化中心 乌苏新华互联网科技做什么的 区块链结合互联网科技 互联网科技资金流入 张召忠谈中国互联网科技 领航科技大厦互联网公司 浙南科技城互联网大厦招聘 珠海东科互联网科技有限公司 广东猫王互联网科技有限公司电话 深圳市人人互联网科技有限公司 互联网科技小贷 九亚互联网科技 上海喔噻互联网科技 互联网科技上市公司 阿里巴巴算科技企业还是互联网 移动互联网科技股 互联网科技公司营业执照怎么办理 新氧科技和美国互联网有关系吗 陕西九四连强互联网科技有限公司
0