Spring集成 - 并发服务激活器

时间:2012-07-24 12:26:42

标签: spring asynchronous concurrency producer-consumer spring-integration

我有一个队列通道和一个带有轮询器的服务激活器,该轮询器从该队列中读取。我想让配置说“我想要50个线程来轮询该队列,每次轮询并收到消息,在这个线程上,调用service-activator指向的服务。”

该服务没有@Async注释,但是无状态且可以安全地以并发方式运行。

下面会这样做吗?是否有其他首选方法可以实现这一目标?

<int:channel id="titles">
    <int:queue/>
</int:channel>

<int:service-activator output-channel="resolvedIds" ref="searchService" method="searchOnTitle" input-channel="titles">
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"></int:poller>
</int:service-activator>

<task:executor id="taskExecutor" pool-size="50" keep-alive="120" />

1 个答案:

答案 0 :(得分:8)

是的,我认为它能满足您的需求。引入QueueChannel后,交互变为异步 - 您不需要@Async。如果您没有明确设置轮询器,它将使用默认轮询器。

您所概述的是实现目标的最佳方式。您可能还会考虑对队列大小进行限制 - 以便在跟上生产者时存在滞后的情况下,它不会导致内存不足问题。如果指定了大小,则通道上的发送呼叫将被阻止 - 充当节流。

您拥有的配置将按预期工作。唯一的问题是,一旦开始为每个端点创建执行程序和轮询器,就很难找出整个应用程序的最佳配置。可以针对几个特定步骤进行这种优化 - 但不是所有端点都没有(你的问题没有表明你正在这样做,只是认为我会提高它。