【问题标题】:Spring Integration JMS/IBM MQ: how to send different message to different queue in parallelSpring Integration JMS/IBM MQ:如何将不同的消息并行发送到不同的队列
【发布时间】:2021-10-03 11:31:27
【问题描述】:

我正在处理一个项目,该项目使用 JMS 侦听器接收传入消息,然后路由到不同的目的地,目前该过程只为每个传入消息选择以下 3 个目的地中的一个。所以xml配置写如下

<integration:router ref="jmsRouter" input-channel="jmsFilterOutput" default-output-channel="jmsRouterOutput"  />

<integration:service-activator id="serviceActivator1" input-channel="input1"
                               ref="messageProcessService" method="callMsgProcessor1" />
                               
<integration:service-activator id="serviceActivator2" input-channel="input2"
                               ref="messageProcessService" method="callMsgProcessor2" />

<integration:service-activator id="serviceActivator3" input-channel="sharedInput"
                               ref="messageProcessService" method="callMsgProcessor3" output-channel="reqChannel" />

以上3个serviceActivator中,最后一个的output-channel在另一个xml配置文件中定义为IBM mq。

现在我的工作是从 sharedInput 生成不同的消息,并并行发送到不同的队列

所以我添加如下一行

<integration:service-activator id="serviceActivator4" input-channel="sharedInput"
                                   ref="messageProcessService" method="callMsgProcessorNew" output-channel="reqChannelNew" />

但是,在运行 JMS 时,来自 sharedInput 的消息只发送到 callMsgProcessor3,填充的消息也只发送到 reqChannel,而忽略我的新目的地。如果我注释掉第三个服务激活器,sharedInput 可以去 callMsgProcessorNew,并路由到新队列。

谁能建议我应该如何配置将 sharedInput 推送到两个处理器(callMsgProcessor3 和 callMsgProcessorNew),并并行发送到它们相应的输出 mq 通道?

我在网上搜索了一下,路由器拆分器或收件人列表路由器似乎可以解决我的问题?但是在阅读了相关文档后仍然感到困惑,并且不知道在我的情况下如何配置它。如果有人可以帮助提供样品,不胜感激

如果我需要提供更多信息来澄清问题,请告诉我。

【问题讨论】:

    标签: spring-integration ibm-mq spring-jms


    【解决方案1】:

    您可以将sharedInput 设为 PublishSubscribeChannel 并让另一个服务激活器订阅它,这样相同的消息就会发送给他们两个。之后,您可以创建完全不同的流程并执行您需要并行的任何逻辑。有关更多信息,请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/core.html#channel-implementations-publishsubscribechannel

    还有各自的 EIP 确定:https://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html

    【讨论】:

    • 谢谢!我可以使用收件人列表路由器来解决问题。 :)
    【解决方案2】:

    感谢您的回复,@Artem!我意识到一件事,sharedInput 只去一个目的地是因为它是一条消息。如果我可以复制消息,它将转到两个目的地。所以我添加了收件人列表路由器,并进行了如下更改,并且成功了!

    <integration:recipient-list-router id="duplicateMsgRouter" input-channel="sharedInput"
        timeout="1234"
        ignore-send-failures="true"
        apply-sequence="true">
        <integration:recipient channel="channel1"/>
        <integration:recipient channel="channel2"/>
    </integration:recipient-list-router> 
    
    <integration:service-activator id="serviceActivator3" input-channel="channel1"
                                   ref="messageProcessService" method="callMsgProcessor3" output-channel="reqChannel" />
    
    <integration:service-activator id="serviceActivator4" input-channel="channel2"
                                   ref="messageProcessService" method="callMsgProcessorNew"  output-channel="reqChannelNew" />  
    

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 2015-07-08
      • 2014-08-28
      • 1970-01-01
      • 2017-09-17
      • 2017-11-08
      • 2021-12-12
      • 2013-06-05
      • 2020-01-25
      相关资源
      最近更新 更多