我正在尝试使用spring集成设置我的应用程序,作为一个新手,需要有关以下用例的建议 -
存在来自其他应用程序的消息被推送的队列。我的应用程序使用来自队列的消息,进行一些数据按摩,然后将其推送到另一个出站队列。目标是,以并发方式处理消息。
根据我的理解,我们可以有两种方法 -
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)Poller将不必要地在后台运行(资源命中)。
ii)即使频道上有消息,也会根据固定速率浪费毫秒(因为轮询器会在每100秒后获取一次消息)。
基于调度程序的配置似乎是消息驱动的,可能对我的用例来说是完美的。如果我错了,请纠正我。在这种情况下,线程仅负责将消息分派给订阅者。
如果是这种情况 -
我是否需要有多个与频道关联的服务激活器?
有没有办法动态附加同一服务激活器配置的多个实例?
建议我解决这个问题的最佳方法是什么。感谢。
答案 0 :(得分:0)
(i)民意调查非常轻松;即使固定速率为0,线程也会在通道中阻塞1秒(默认情况下为receive-timeout
);我怀疑你甚至会测量空闲轮询器使用的CPU。
(ii)参见(i) - 减少轮询间隔将减轻任何延迟。
在任何情况下,如果您正在谈论JMS,您可能不想使用任何一种方法 - 如果您希望出站发送参与与入站消息相同的事务(即,只提交删除,如果发送成功),你不能交给另一个线程 - 如果你这样做,那么将立即提交消息删除。
相反,使用消息驱动的通道适配器并使用其并发设置来增加线程数;然后在整个过程中使用直接渠道。