我正在使用
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入站通道适配器中并发使用者的值集与任务执行器配置中的池大小之间的关系是什么。
以下是我在Eclipse中使用JVM Monitor插件时所观察到的内容。
如果并发使用者大于池大小且池大小为x, 然后创建x个线程,但它们处于阻塞状态 消息未得到处理。
如果concurrent-consumer等于pool-size且pool-size为x, 然后创建x个线程并处理消息。
如果并发使用者小于池大小并且 concurrent-consumers是y,然后创建y个线程和消息 处理完毕。
我认为并发消费者可能正在设置执行者的最大池大小。这是准确的观察吗?
答案 0 :(得分:3)
我说你的调查是正确的。
消费者在while(true)
实施中是Runnable.run
的长寿任务,因此他们每个人都永远从该执行者那里获得一个线程(当然,直到它死亡)。
Executor
中的默认SimpleAsyncTaskExecutor
为SimpleMessageListenerContainer
。这意味着任何新的消费者都会获得自己的线程,并且不会导致阻塞问题。
使用ThreadPoolTaskExecutor
时,如果池中没有足够的线程供我们使用,我们真的会遇到问题。有些消费者不会做他们的工作。当我们在不同组件之间共享taskExecutor
时,可能会越糟糕。
在应用程序中使用managed
执行程序(特别是在AS环境中),即使对于这种长期存在的任务也是如此,但我们确实应该确保我们拥有最佳的并发配置