首页 文章

Spring集成 - 并发服务激活器

提问于
浏览
7

我有一个队列通道,以及一个带有轮询器的服务激活器,它从该队列中读取 . 我想要配置说“我想要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 回答

  • 8

    是的,我认为它符合您的要求 . 引入QueueChannel后,交互变为异步 - 您不需要@Async . 如果您没有显式设置轮询器,它将使用默认轮询器 .

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

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

相关问题