7

我有一个队列通道和一个带有从该队列读取的轮询器的服务激活器。我想要配置说“我想要 50 个线程来轮询该队列,并且每次轮询并返回消息时,在该线程上调用服务激活器指向的服务。”

该服务没有@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" />
4

1 回答 1

8

是的,我认为它可以满足您的需求。一旦你引入了一个 QueueChannel,交互就变成了异步的——你不需要@Async。如果您没有明确设置轮询器,它将使用默认轮询器。

您所概述的是实现它的最佳方法。您也可以考虑对队列大小进行限制 - 这样,如果在跟上生产者的速度上存在滞后,就不会导致内存不足的问题。如果指定了大小,则通道上的发送调用将阻塞 - 充当节流阀。

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

于 2012-07-24T13:04:13.210 回答