spring 以并发方式集成处理消息

spring integration processing messages in a concurrent manner

我正在尝试使用 spring 集成设置我的应用程序,作为新手,需要有关以下用例的建议 -

有一个队列正在推送来自另一个应用程序的消息。我的应用程序使用队列中的消息,进行一些数据处理,然后将其推送到另一个出站队列。目标是以并发方式处理消息。

根据我的理解,我们可以有 2 种方法-

1- 使用#Poller

<int:service-activator ref="messageProcessor" method="process" input-channel="incomingChannel">
    <int:poller fixed-rate="100" task-executor="executor" />
<int:service-activator/>
<task:executor id="executor" pool-size="10"/>

2- 使用#Dispatcher

<int:channel id="incomingChannel">
    <int:dispatcher task-executor="executor"/>
</int:channel>
<int:service-activator ref="messageProcessor" method="process" input-channel="incomingChannel" />

<task:executor id="executor" pool-size="10"/>

查看基于轮询器的配置,似乎池中将有多个线程可用,获取消息并同时处理它。这里关注的是-

i) 轮询器将不必要地在后台保留 运行(资源命中)。

ii) 即使通道上有消息,也会根据固定速率浪费毫秒数(因为轮询器将在每 100 秒后获取消息)。

基于调度程序的配置似乎是消息驱动的,可能非常适合我的用例。如果我错了,请纠正我,在这种情况下,线程只负责将消息分派给订阅者。

如果是这样-

我是否需要将多个服务激活器与频道相关联?

有什么方法可以动态附加同一服务激活器配置的多个实例吗?

建议我最好的处理方法。谢谢

(i) 轮询非常轻量级;即使固定速率为 0,线程也会在通道中阻塞 1 秒(默认 - receive-timeout);我怀疑您甚至会测量空闲轮询器使用的 cpu。

(ii) 请参阅 (i) - 减少轮询间隔将减少任何延迟。

无论如何,如果您谈论的是 JMS,您可能不想使用任何一种方法 - 如果您希望出站发送与入站消息参与同一事务(即仅在以下情况下提交删除)发送成功),您不得移交给另一个线程 - 如果您这样做,消息删除将在那时立即提交。

改为使用消息驱动的通道适配器并使用其并发设置来增加线程数;然后全程使用直接渠道。