对于最新的稳定版本,请使用 Spring AMQP 3.2.0spring-doc.cn

消息侦听器容器配置

配置与事务和服务质量相关的 (SMLC) 和 (DMLC) 的选项相当多,其中一些选项是相互交互的。 适用于 SMLC、DMLC 或 (StLC) 的属性(请参阅使用 RabbitMQ Stream 插件)由相应列中的复选标记指示。 请参阅选择容器,了解可帮助您确定哪个容器适合您的应用程序的信息。SimpleMessageListenerContainerDirectMessageListenerContainerStreamListenerContainerspring-doc.cn

下表显示了使用命名空间配置 . 该元素上的属性可以是 (default) 或分别指定 or。 某些属性不由命名空间公开。 这些由 for the attribute 表示。<rabbit:listener-container/>typesimpledirectSMLCDMLCN/Aspring-doc.cn

表 1.消息侦听器容器的配置选项
财产 (属性) 描述 SMLC 公司 DMLC StLC

ackTimeout
(不适用)
spring-doc.cn

设置后,此超时将用作发送 ack 的替代方法。 当新消息到达时,将未确认的消息计数与 进行比较,并将自上次确认以来的时间与此值进行比较。 如果任一条件为 ,则确认消息。 当没有新消息到达并且有未确认的消息时,此超时是近似值,因为仅检查每个条件。 另请参阅 和 在此表中。messagesPerAckmessagesPerAcktruemonitorIntervalmessagesPerAckmonitorIntervalspring-doc.cn

刻度线

acknowledgeMode
(确认)
spring-doc.cn

  • NONE:不发送确认(不兼容)。 RabbitMQ 将此称为“autoack”,因为代理假定所有消息都已确认,而无需使用者执行任何操作。channelTransacted=truespring-doc.cn

  • MANUAL:侦听器必须通过调用 来确认所有消息。Channel.basicAck()spring-doc.cn

  • AUTO:容器会自动确认消息,除非引发异常。 请注意,这是对 — 如果通道是事务处理的,则 broker 除了 ack 之外还需要提交通知。 这是默认模式。 另请参阅 。MessageListeneracknowledgeModechannelTransactedbatchSizespring-doc.cn

刻度线
刻度线

建议链
(advice-chain)
spring-doc.cn

应用于侦听器执行的 AOP Advice 数组。 这可用于应用其他横切关注点,例如在 broker 死亡时自动重试。 请注意,只要代理仍然处于活动状态,AMQP 错误后的简单重新连接就会由 处理。CachingConnectionFactoryspring-doc.cn

刻度线
刻度线

afterReceivePostProcessors
(不适用)
spring-doc.cn

在调用侦听器之前调用的实例的数组。 后处理器可以实现 或 . 数组使用最后调用的无序成员进行排序。 如果后处理器返回 ,则丢弃消息(并确认,如果合适)。MessagePostProcessorPriorityOrderedOrderednullspring-doc.cn

刻度线
刻度线

alwaysRequeueWithTxManagerRollback
(不适用)
spring-doc.cn

设置为在配置事务管理器时始终在回滚时重新排队消息。truespring-doc.cn

刻度线
刻度线

autoDeclare
(自动声明)
spring-doc.cn

当设置为 (default) 时,如果容器在启动期间检测到至少一个队列丢失,则容器使用 a 重新声明所有 AMQP 对象(队列、交换、绑定),这可能是因为它是队列或过期的队列,但如果队列由于任何原因丢失,则重新声明将继续。 要禁用此行为,请将此属性设置为 。 请注意,如果容器的所有队列都缺失,则容器将无法启动。trueRabbitAdminauto-deletefalsespring-doc.cn

在版本 1.6 之前,如果上下文中有多个 admin,则容器将随机选择一个。 如果没有管理员,它将在内部创建一个管理员。 无论哪种情况,都可能导致意外结果。 从版本 1.6 开始,要使上下文中只有一个,或者必须使用该属性在容器上配置对特定实例的引用。autoDeclareRabbitAdminrabbitAdmin
刻度线
刻度线

autoStartup
(自动启动)
spring-doc.cn

标志,指示容器应在启动时启动(作为回调的一部分,在所有 bean 初始化后发生)。 默认为 ,但您可以将其设置为如果您的代理在启动时可能不可用,并在知道代理准备就绪时稍后手动调用。ApplicationContextSmartLifecycletruefalsestart()spring-doc.cn

刻度线
刻度线
刻度线

batchSize
(交易大小) (批量大小)
spring-doc.cn

当与 set to 一起使用时,容器会尝试在发送确认之前处理最多此数量的消息(等待每条消息直到接收超时设置)。 这也是提交事务通道时。 如果 小于 ,则增加 以匹配 。acknowledgeModeAUTOprefetchCountbatchSizebatchSizespring-doc.cn

刻度线

batchingStrategy
(不适用)
spring-doc.cn

对消息进行 debatchng 时使用的策略。 违约。 请参阅批处理使用 Batching 进行@RabbitListenerSimpleDebatchingStrategyspring-doc.cn

刻度线
刻度线

channelTransacted
(channel-transacted)
spring-doc.cn

Boolean 标志,表示应在事务中确认所有消息(手动或自动)。spring-doc.cn

刻度线
刻度线

并发
(N/A)
spring-doc.cn

m-n每个侦听器的并发使用者范围(最小值、最大值)。 如果 only 提供,则为固定数量的使用者。 请参阅 侦听器并发nnspring-doc.cn

刻度线

concurrentConsumers
(并发)
spring-doc.cn

每个侦听器最初要启动的并发使用者数。 请参阅 侦听器并发。 对于 ,并发是通过重载方法控制的;请参阅使用具有单个活动使用者的 Super StreamsStLCsuperStreamspring-doc.cn

刻度线
刻度线

connectionFactory
(连接工厂)
spring-doc.cn

对 . 使用 XML 名称空间进行配置时,默认引用的 Bean 名称为 。ConnectionFactoryrabbitConnectionFactoryspring-doc.cn

刻度线
刻度线

consecutiveActiveTrigger
(min-consecutive-active)
spring-doc.cn

在考虑启动新使用者时,使用者在未发生接收超时的情况下接收的连续消息的最小数量。 也受 'batchSize' 影响。 请参阅 侦听器并发。 默认值:10。spring-doc.cn

刻度线

consecutiveIdleTrigger
(min-consecutive-idle)
spring-doc.cn

使用者在考虑停止使用者之前必须经历的最小接收超时次数。 也受 'batchSize' 影响。 请参阅 侦听器并发。 默认值:10。spring-doc.cn

刻度线

consumerBatchEnabled
(支持批处理)
spring-doc.cn

如果支持,则将其设置为 true 可启用离散消息的批处理,最高可达 ;如果没有新消息到达或收集批处理消息 time exceeded ,将传送部分批处理。 如果为 false,则仅支持由 producer 创建的批处理;请参阅 批处理MessageListenerbatchSizereceiveTimeoutbatchReceiveTimeoutspring-doc.cn

刻度线

consumerCustomizer
(不适用)
spring-doc.cn

用于修改容器创建的流使用者的 Bean。ConsumerCustomizerspring-doc.cn

刻度线

consumerStartTimeout
(不适用)
spring-doc.cn

等待使用者线程启动的时间(以毫秒为单位)。 如果超过此时间,则会写入错误日志。 发生这种情况的一个示例是,如果配置的线程不足以支持 container 。taskExecutorconcurrentConsumersspring-doc.cn

请参阅 线程处理和异步使用者。 默认值:60000(1 分钟)。spring-doc.cn

刻度线

consumerTagStrategy
(消费者标签策略)
spring-doc.cn

设置 ConsumerTagStrategy 的实现,以便为每个使用者创建一个(唯一)标签。spring-doc.cn

刻度线
刻度线

consumersPerQueue
(每个队列的使用者)
spring-doc.cn

要为每个配置的队列创建的使用者数量。 请参阅 侦听器并发spring-doc.cn

刻度线

consumeDelay
(不适用)
spring-doc.cn

RabbitMQ Sharding Plugin 与 一起使用时,存在争用条件,该条件可能会阻止使用者在分片之间均匀分布。 使用此属性可在使用者启动之间添加一个小的延迟,以避免这种争用条件。 您应该尝试各种值以确定适合您环境的延迟。concurrentConsumers > 1spring-doc.cn

刻度线
刻度线

debatching已启用
(N/A)
spring-doc.cn

如果为 true,则侦听器容器将对批处理消息进行 Debatch,并使用批处理中的每条消息调用侦听器。 从版本 2.2.7 开始,如果侦听器是 或 ,则生产者创建的批处理将被解除批处理。 否则,将一次显示一个来自批处理的消息。 默认为 true。 请参阅批处理使用 Batching 进行@RabbitListenerList<Message>BatchMessageListenerChannelAwareBatchMessageListenerspring-doc.cn

刻度线
刻度线

declarationRetries
(declaration-retries)
spring-doc.cn

被动队列声明失败时的重试尝试次数。 被动队列声明发生在使用者启动时,或者从多个队列中使用时,当初始化期间并非所有队列都可用时。 当重试用尽后无法被动声明任何已配置的队列时(出于任何原因),容器行为由前面描述的“missingQueuesFatal”属性控制。 默认值:重试 3 次(总共 4 次尝试)。spring-doc.cn

刻度线

defaultRequeueRejected
(重新排队-已拒绝)
spring-doc.cn

确定是否应将因侦听器引发异常而被拒绝的消息重新排队。 违约:。truespring-doc.cn

刻度线
刻度线

errorHandler
(错误处理程序)
spring-doc.cn

对处理在执行 MessageListener 期间可能发生的任何未捕获异常的策略的引用。 违约:ErrorHandlerConditionalRejectingErrorHandlerspring-doc.cn

刻度线
刻度线

Exclusive
(独家)
spring-doc.cn

确定此容器中的单个使用者是否具有对队列的独占访问权限。 当 为 时,容器的并发数必须为 1。 如果另一个使用者具有独占访问权限,则容器会尝试根据 or 恢复使用者。 使用命名空间时,此属性与队列名称一起显示在元素上。 违约:。truerecovery-intervalrecovery-back-off<rabbit:listener/>falsespring-doc.cn

刻度线
刻度线

exclusiveConsumerExceptionLogger
(不适用)
spring-doc.cn

当独占使用者无法访问队列时使用的异常记录器。 默认情况下,此记录在 级别.WARNspring-doc.cn

刻度线
刻度线

failedDeclarationRetryInterval
(failed-declaration -重试间隔)
spring-doc.cn

被动队列声明重试尝试之间的间隔。 被动队列声明发生在使用者启动时,或者从多个队列中使用时,当初始化期间并非所有队列都可用时。 默认值:5000(5 秒)。spring-doc.cn

刻度线
刻度线

forceCloseChannel
(不适用)
spring-doc.cn

如果使用者在 中未响应 shutdown ,则为 ,则通道将关闭,从而导致任何未确认的消息重新排队。 默认为 2.0 起。 您可以将其设置为 以恢复到之前的行为。shutdownTimeouttruetruefalsespring-doc.cn

刻度线
刻度线

forceStop
(不适用)
spring-doc.cn

设置为 true 可在处理当前记录后停止(当容器停止时);导致所有预取的消息重新排队。 默认情况下,容器会取消 Consumer 并在停止之前处理所有预取的消息。 版本 2.4.14、3.0.6 的最新版本 默认为 。falsespring-doc.cn

刻度线
刻度线

globalQos
(global-qos)
spring-doc.cn

如果为 true,则 the 将全局应用于通道,而不是应用于通道上的每个使用者。 有关更多信息,请参阅 basicQos.globalprefetchCountspring-doc.cn

刻度线
刻度线

(群展)spring-doc.cn

这仅在使用 namespace 时可用。 指定后,将使用此名称注册 类型的 Bean,并且 容器 将添加到集合中。 例如,这允许通过迭代集合来启动和停止容器组。 如果多个元素具有相同的 group 值,则集合表单中的容器 如此指定的所有容器的集合。Collection<MessageListenerContainer><listener/><listener-container/>spring-doc.cn

刻度线
刻度线

idleEventInterval
(空闲事件间隔)
spring-doc.cn

请参阅 检测空闲的异步使用者spring-doc.cn

刻度线
刻度线

javaLangErrorHandler
(不适用)
spring-doc.cn

当容器线程捕获 . 默认实现调用 ;要恢复到之前的行为(不执行任何操作),请添加 no-op 处理程序。AbstractMessageListenerContainer.JavaLangErrorHandlerErrorSystem.exit(99)spring-doc.cn

刻度线
刻度线

maxConcurrentConsumers
(最大并发)
spring-doc.cn

如果需要,按需启动的最大并发使用者数。 必须大于或等于 'concurrentConsumers'。 请参阅 侦听器并发spring-doc.cn

刻度线

messagesPerAck
(不适用)
spring-doc.cn

ack 之间要接收的消息数。 使用此选项可以减少发送到代理的 ack 数(以增加重新传送消息的可能性为代价)。 通常,您应该仅在高容量侦听器容器上设置此属性。 如果设置了此选项并且消息被拒绝(引发异常),则会确认待处理的确认并拒绝失败的消息。 不允许用于事务处理通道。 如果 小于 ,则增加 以匹配 。 默认值:ack every message 另请参阅此表中的内容。prefetchCountmessagesPerAckmessagesPerAckackTimeoutspring-doc.cn

刻度线

mismatchedQueuesFatal
(mismatched-queues-fatal)
spring-doc.cn

当容器启动时,如果此属性为 (default: ),则容器将检查上下文中声明的所有队列是否与代理上已有的队列兼容。 如果存在不匹配的属性(例如 ) 或参数 (skuch as ),则容器(和应用程序上下文)无法启动并出现致命异常。truefalseauto-deletex-message-ttlspring-doc.cn

如果在恢复过程中检测到问题(例如,在丢失连接后),则容器将停止。spring-doc.cn

应用程序上下文中必须有一个 single (或使用 property 在容器上专门配置的 single )。 否则,此属性必须为 。RabbitAdminrabbitAdminfalsespring-doc.cn

如果代理在初始启动期间不可用,则容器将启动,并在建立连接时检查条件。
将针对上下文中的所有队列进行检查,而不仅仅是针对特定侦听器配置为使用的队列。 如果您希望将检查限制为容器使用的那些队列,则应为容器配置单独的队列,并使用属性提供对它的引用。 有关更多信息,请参阅 条件声明RabbitAdminrabbitAdmin
在标记为 的 bean 中为 a 启动容器时,将禁用不匹配的队列参数检测。 这是为了避免潜在的死锁,这可能会使此类容器的启动延迟长达 60 秒。 使用惰性侦听器 bean 的应用程序应该在获取对惰性 bean 的引用之前检查队列参数。@RabbitListener@Lazy
刻度线
刻度线

missingQueuesFatal
(missing-queues-fatal)
spring-doc.cn

当设置为 (default) 时,如果代理上没有任何配置的队列可用,则将其视为致命队列。 这会导致应用程序上下文在启动期间无法初始化。 此外,在容器运行时删除队列时,默认情况下,使用者会重试 3 次以连接到队列(间隔 5 秒),并在这些尝试失败时停止容器。truespring-doc.cn

这在以前的版本中是不可配置的。spring-doc.cn

设置为 时,在进行 3 次重试后,容器将进入恢复模式,就像其他问题(如代理关闭)一样。 容器尝试根据属性进行恢复。 在每次恢复尝试期间,每个使用者再次尝试四次,以 5 秒的间隔被动声明队列。 这个过程无限期地持续下去。falserecoveryIntervalspring-doc.cn

您还可以使用 properties Bean 为所有容器全局设置属性,如下所示:spring-doc.cn

<util:properties
        id="spring.amqp.global.properties">
    <prop key="mlc.missing.queues.fatal">
        false
    </prop>
</util:properties>

此全局属性不适用于设置了 explicit 属性的任何容器。missingQueuesFatalspring-doc.cn

默认重试属性(每隔 5 秒重试 3 次)可以通过设置以下属性来覆盖。spring-doc.cn

在标记为 的 bean 中为 a 启动容器时,将禁用缺少队列检测。 这是为了避免潜在的死锁,这可能会使此类容器的启动延迟长达 60 秒。 使用惰性侦听器 bean 的应用程序应该在获取对惰性 bean 的引用之前检查队列。@RabbitListener@Lazy
刻度线
刻度线

monitorInterval
(监视器间隔)
spring-doc.cn

使用 DMLC 时,将计划在此间隔运行任务,以监控使用者的状态并恢复任何失败的状态。spring-doc.cn

刻度线

非本地
(N/A)
spring-doc.cn

设置为 to 以禁止从服务器向在同一通道的连接上发布的使用者消息传送。truespring-doc.cn

刻度线
刻度线

phase
(相位)
spring-doc.cn

When is ,此容器应在其中启动和停止的生命周期阶段。 值越低,此容器开始得越早,停止得越晚。 默认值为 ,表示容器尽可能晚地启动并尽快停止。autoStartuptrueInteger.MAX_VALUEspring-doc.cn

刻度线
刻度线

possibleAuthenticationFailureFatal
(可能的身份验证失败致命)
spring-doc.cn

当设置为 (SMLC 的默认值) 时,如果在连接期间引发 a,则将其视为致命的。 这会导致应用程序上下文在启动期间无法初始化(如果容器配置了自动启动)。truePossibleAuthenticationFailureExceptionspring-doc.cn

2.0 版本开始。spring-doc.cn

DirectMessageListenerContainerspring-doc.cn

当设置为 (default) 时,每个使用者将尝试根据 .falsemonitorIntervalspring-doc.cn

SimpleMessageListenerContainer (简单消息监听器容器)spring-doc.cn

设置为 时,在进行 3 次重试后,容器将进入恢复模式,就像其他问题(如代理关闭)一样。 容器将尝试根据属性进行恢复。 在每次恢复尝试期间,每个使用者将再次尝试 4 次以启动。 这个过程将无限期地持续下去。falserecoveryIntervalspring-doc.cn

您还可以使用 properties Bean 为所有容器全局设置属性,如下所示:spring-doc.cn

<util:properties
    id="spring.amqp.global.properties">
  <prop
    key="mlc.possible.authentication.failure.fatal">
     false
  </prop>
</util:properties>

此全局属性不会应用于设置了 explicit 属性的任何容器。missingQueuesFatalspring-doc.cn

默认重试属性(3 次重试,间隔 5 秒)可以使用此属性之后的属性覆盖。spring-doc.cn

刻度线
刻度线

prefetchCount
(预取)
spring-doc.cn

每个使用者可以未完成的未确认消息数。 此值越高,消息的传递速度就越快,但非顺序处理的风险就越高。 如果 为 ,则忽略 。 如有必要,将增加此值以匹配 或 。 自 2.0 起默认为 250。 您可以将其设置为 1 以恢复到之前的行为。acknowledgeModeNONEbatchSizemessagePerAckspring-doc.cn

在某些情况下,prefetch 值应 低 — 例如,对于大型消息,尤其是在处理速度较慢的情况下(消息可能会累积 添加到客户端进程中的大量内存),并且如果需要严格的消息排序 (在这种情况下,prefetch 值应设置回 1)。 此外,对于低容量消息收发和多个使用者(包括单个侦听器容器实例中的并发),您可能希望减少预取,以便在使用者之间更均匀地分配消息。

另请参阅 。globalQosspring-doc.cn

刻度线
刻度线

rabbitAdmin
(管理员)
spring-doc.cn

当侦听器容器侦听至少一个自动删除队列并且在启动期间发现该队列缺失时,该容器将使用 a 来声明该队列以及任何相关的绑定和交换。 如果此类元素配置为使用条件声明(请参阅条件声明),则容器必须使用配置为声明这些元素的 admin。 在此处指定该管理员。 仅当使用带有条件声明的自动删除队列时,才需要它。 如果您不希望在容器启动之前声明自动删除队列,请在 admin 上设置为 。 默认为声明所有非条件元素的 a。RabbitAdminauto-startupfalseRabbitAdminspring-doc.cn

刻度线
刻度线

receiveTimeout
(接收超时)
spring-doc.cn

等待每条消息的最长时间。 如果 ,则效果非常小 — 容器旋转并请求另一条消息。 它对事务性 with 的影响最大,因为它可能导致在超时到期之前不确认已使用的消息。 如果为 true,则如果在批处理完成之前发生此超时,则将交付部分批处理。acknowledgeMode=NONEChannelbatchSize > 1consumerBatchEnabledspring-doc.cn

刻度线

batchReceiveTimeout
(批处理接收超时)
spring-doc.cn

收集批处理消息的超时毫秒数。 它限制了等待填充 batchSize 的时间。 当收集批量消息的时间大于 时,将传递 batch。 默认值为 0 (无超时)。batchSize > 1batchReceiveTimespring-doc.cn

刻度线

recoveryBackOff
(recovery-back-off)
spring-doc.cn

指定在使用者因非致命原因无法启动时尝试启动使用者之间的间隔。 默认为每 5 秒无限次重试。 与 互斥。BackOffFixedBackOffrecoveryIntervalspring-doc.cn

刻度线
刻度线

recoveryInterval
(恢复间隔)
spring-doc.cn

确定如果使用者由于非致命原因而无法启动,则尝试启动使用者之间的时间(以毫秒为单位)。 默认值:5000。 与 互斥。recoveryBackOffspring-doc.cn

刻度线
刻度线

retryDeclarationInterval
(缺失队列- retry-interval)
spring-doc.cn

如果配置的队列的子集在使用者初始化期间可用,则使用者将开始从这些队列中使用。 使用者尝试使用此间隔被动声明缺少的队列。 当此间隔过后,将再次使用 'declarationRetries' 和 'failedDeclarationRetryInterval'。 如果仍然缺少队列,使用者会再次等待此间隔,然后再尝试一次。 此过程将无限期地持续,直到所有队列都可用。 默认值:60000(1 分钟)。spring-doc.cn

刻度线

shutdownTimeout
(不适用)
spring-doc.cn

当容器关闭时(例如, 如果其封闭已关闭),则它会等待处理不超过此限制的 In-Flight 消息。 默认为 5 秒。ApplicationContextspring-doc.cn

刻度线
刻度线

startConsumerMinInterval
(最小开始间隔)
spring-doc.cn

按需启动每个新使用者之前必须经过的时间(以毫秒为单位)。 请参阅 侦听器并发。 默认值:10000(10 秒)。spring-doc.cn

刻度线

statefulRetryFatal
与 NullMessageId (不适用)
spring-doc.cn

使用有状态重试通知时,如果收到带有 missing 属性的消息,则将其视为 fatal (它已停止)。 将此项设置为 to 丢弃(或路由到死信队列)此类消息。messageIdfalsespring-doc.cn

刻度线
刻度线

stopConsumerMinInterval
(最小停止间隔)
spring-doc.cn

在检测到空闲使用者时,自最后一个使用者停止以来,在停止使用者之前必须经过的时间(以毫秒为单位)。 请参阅 侦听器并发。 默认值:60000(1 分钟)。spring-doc.cn

刻度线

streamConverter
(不适用)
spring-doc.cn

A 将本机 Stream 消息转换为 Spring AMQP 消息。StreamMessageConverterspring-doc.cn

刻度线

taskExecutor
(任务执行者)
spring-doc.cn

对 Spring (或标准 JDK 1.5+ )的引用,用于执行侦听器调用程序。 默认值为 a ,使用内部管理的线程。TaskExecutorExecutorSimpleAsyncTaskExecutorspring-doc.cn

刻度线
刻度线

taskScheduler
(任务计划程序)
spring-doc.cn

使用 DMLC 时,调度程序用于在 'monitorInterval' 运行监视任务。spring-doc.cn

刻度线

transactionManager
(事务管理器)
spring-doc.cn

用于侦听器操作的外部事务管理器。 也是补充 — 如果 the 是 transacted,则其事务与外部事务同步。channelTransactedChannelspring-doc.cn

刻度线
刻度线