首页 文章

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

提问于
浏览
4

我在用

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 回答

  • 3

    我会说你的调查是正确的 .

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

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

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

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

相关问题