首页 文章

spring并发处理消息的并发方式

提问于
浏览
0

我正在尝试使用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 回答

  • 0

    (i)民意调查非常轻;即使固定速率为0,线程也会在通道中阻塞1秒钟(默认情况下为 receive-timeout );我怀疑你甚至会测量空闲轮询器使用的CPU .

    (ii)参见(i) - 减少轮询间隔将减轻任何延迟 .

    在任何情况下,如果您正在谈论JMS,您可能不希望使用任何一种方法 - 如果您希望出站发送参与与入站消息相同的事务(即,只有在发送成功时才提交删除),你 must not hand off to another thread - 如果这样做,那么将立即提交消息删除 .

    相反,使用消息驱动的通道适配器并使用其并发设置来增加线程数;然后使用直接通道 .

相关问题