我在用
Spring Integration 4.1.2.RELEASE
Spring AMQP 1.4.3.RELEASE
我有一个AMQP入站通道适配器和一个ThreadPoolTaskExecutor配置如下:
<task:executor id="exec.newItems" pool-size="5" />
<int-amqp:inbound-channel-adapter
connection-factory="amqpConnectionFactory" auto-startup="true"
queue-names="#{newItemsQueueName}"
channel="newItems.payloadType.routingChannel"
message-converter="jsonMessageConverter"
acknowledge-mode="AUTO" error-channel="errorChannel"
concurrent-consumers="5"
mapped-request-headers="*"
channel-transacted="false"
task-executor="exec.newItems"
/>
我想知道AMQP入站通道适配器中并发使用者的值集与任务 Actuator 配置中的池大小之间的关系是什么 .
以下是我在Eclipse中使用JVM Monitor插件所观察到的内容 .
-
如果concurrent-consumers大于pool-size且pool-size为x,则创建x个线程,但它们处于阻塞状态,并且不处理消息 .
-
如果concurrent-consumers等于pool-size且pool-size为x,则创建x个线程并处理消息 .
-
如果并发使用者小于池大小且并发使用者是y,则创建y个线程并处理消息 .
我认为并发消费者可能正在设置执行者的最大池大小 . 这是准确的观察吗?
1 回答
我会说你的调查是正确的 .
消费者在他们的
Runnable.run
实施中是长期生活的任务,因此他们每个人都永远从该执行者那里获得一个线程(当然直到它死亡) .SimpleMessageListenerContainer
中的默认Executor
是SimpleAsyncTaskExecutor
. 这意味着任何新的消费者都会获得自己的线程,并且不会导致阻塞问题 .使用
ThreadPoolTaskExecutor
时,如果池中没有足够的线程供我们使用,我们真的会遇到问题 . 有些消费者不会做他们的工作 . 当我们在不同组件之间共享taskExecutor
时,它可能会越糟糕 .在应用程序中使用
managed
executor(特别是在AS环境中),即使对于这种长期存在的任务也是如此,但我们确实应该确保我们具有最佳的并发配置 .