AMQP入站通道适配器并发 - 消费者属性与任务执行者之间的关系

时间:2015-03-25 22:53:15

标签: spring-integration

我正在使用

Spring Integration 4.1.2.RELEASE

Spring AMQP 1.4.3.RELEASE

我有一个AMQP入站通道适配器和一个如下配置的ThreadPoolTask​​Executor:

<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个线程和消息 处理完毕。

我认为并发消费者可能正在设置执行者的最大池大小。这是准确的观察吗?

1 个答案:

答案 0 :(得分:3)

我说你的调查是正确的。

消费者在while(true)实施中是Runnable.run的长寿任务,因此他们每个人都永远从该执行者那里获得一个线程(当然,直到它死亡)。

Executor中的默认SimpleAsyncTaskExecutorSimpleMessageListenerContainer。这意味着任何新的消费者都会获得自己的线程,并且不会导致阻塞问题。

使用ThreadPoolTaskExecutor时,如果池中没有足够的线程供我们使用,我们真的会遇到问题。有些消费者不会做他们的工作。当我们在不同组件之间共享taskExecutor时,可能会越糟糕。

在应用程序中使用managed执行程序(特别是在AS环境中),即使对于这种长期存在的任务也是如此,但我们确实应该确保我们拥有最佳的并发配置