我正在尝试使用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秒后获取一次消息) .
基于调度程序的配置似乎是消息驱动的,可能非常适合我的用例 . 如果我错了,请纠正我 . 在这种情况下,线程仅负责将消息分派给订阅者 .
如果是这样的话 -
我是否需要有多个与 Channels 关联的服务激活器?
有没有办法动态附加同一服务激活器配置的多个实例?
建议我解决这个问题的最佳方法是什么 . 谢谢 .
1 回答
(i)民意调查非常轻;即使固定速率为0,线程也会在通道中阻塞1秒钟(默认情况下为
receive-timeout
);我怀疑你甚至会测量空闲轮询器使用的CPU .(ii)参见(i) - 减少轮询间隔将减轻任何延迟 .
在任何情况下,如果您正在谈论JMS,您可能不希望使用任何一种方法 - 如果您希望出站发送参与与入站消息相同的事务(即,只有在发送成功时才提交删除),你 must not hand off to another thread - 如果这样做,那么将立即提交消息删除 .
相反,使用消息驱动的通道适配器并使用其并发设置来增加线程数;然后使用直接通道 .