我有一个队列通道和一个带有轮询器的服务激活器,该轮询器从该队列中读取。我想让配置说“我想要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" />
答案 0 :(得分:8)
是的,我认为它能满足您的需求。引入QueueChannel后,交互变为异步 - 您不需要@Async。如果您没有明确设置轮询器,它将使用默认轮询器。
您所概述的是实现目标的最佳方式。您可能还会考虑对队列大小进行限制 - 以便在跟上生产者时存在滞后的情况下,它不会导致内存不足问题。如果指定了大小,则通道上的发送呼叫将被阻止 - 充当节流。
您拥有的配置将按预期工作。唯一的问题是,一旦开始为每个端点创建执行程序和轮询器,就很难找出整个应用程序的最佳配置。可以针对几个特定步骤进行这种优化 - 但不是所有端点都没有(你的问题没有表明你正在这样做,只是认为我会提高它。