Spring Integration - 并发服务激活器

Posted

技术标签:

【中文标题】Spring Integration - 并发服务激活器【英文标题】:Spring Integration - Concurrent Service Activators 【发布时间】:2012-07-22 18:29:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于Spring Integration - 并发服务激活器的主要内容,如果未能解决你的问题,请参考以下文章

使用spring-integration快速实现mysql分布锁

使用spring-integration快速实现mysql分布锁

Spring-Integration:在异常时不发送Tcp服务器响应

XMPP - Spring Integration:spring 应用程序是不是运行嵌入式 XMPP 服务器

Spring Integration 可以在多服务器环境中使用吗

将消息发送到套接字端口并使用Spring Integration接收响应