在 spring-integration 中使用有效负载类型路由器通过列表通用有效负载路由消息

Posted

技术标签:

【中文标题】在 spring-integration 中使用有效负载类型路由器通过列表通用有效负载路由消息【英文标题】:Routing the message with List Generic payloads using payload-type-router in spring-integration 【发布时间】:2021-12-02 12:49:46 【问题描述】:

我正在尝试在旧版应用程序的基于 xml 的配置中使用有效负载类型路由器,并且该应用程序既不会路由到特定通道,也不会在该实例中引发任何错误。我们可以使用 XML 配置使用 payload-type-router 路由 List> 类型的消息吗?我在文档中没有找到太多示例,因为它只提到了使用 Integer、String 类而不是 List 的路由。

 <int:payload-type-router input-channel="run-router-channel">
        <int:mapping type="com.foo.req.BlRunnerRequest" channel="runner-channel"/>
        <int:mapping type="java.util.List" channel="run-channel"/>  <!-- can spring integration support this approach-->
 </int:payload-type-router> 

提前致谢。 XML 中这种路由的替代方案是什么?

【问题讨论】:

【参考方案1】:

是的。我们可以。我刚刚将项目中的单元测试修改成这样:

<payload-type-router id="router" input-channel="routingChannel">
    <mapping type="java.lang.String" channel="channel1" />
    <mapping type="java.lang.Integer" channel="channel2" />
    <mapping type="java.lang.Number[]" channel="channel3" />
    <mapping type="java.lang.Long[]" channel="channel4" />
    <mapping type="java.util.List" channel="channel5" />
</payload-type-router>

我在测试方法中这样做:

testService.foo(new GenericMessage<>(new ArrayList()));
PollableChannel channel5 = (PollableChannel) context.getBean("channel5");
assertThat(channel5.receive(100).getPayload()).isInstanceOf(List.class);

在您的情况下可能发生了其他事情,并且该请求有效负载实际上不是java.util.List

当路由器无法将消息传递到某个通道时,它也有这个逻辑:

    if (!sent) 
        getDefaultOutputChannel();
        if (this.defaultOutputChannel != null) 
            this.messagingTemplate.send(this.defaultOutputChannel, message);
        
        else 
            throw new MessageDeliveryException(message, "No channel resolved by router '" + this
                    + "' and no 'defaultOutputChannel' defined.");
        
    

由于我没有从您的代码 sn-p 中看到 defaultOutputChannel 配置,这仅意味着抛出了 MessageDeliveryException。如果你没有在你的盒子里看到它,那么你会以某种方式吞下它。

【讨论】:

是的,你是对的,谢谢你的回答。问题是中间有一个服务激活器,它接受消息并返回 void(无),因此消息在此过程中丢失。是否有任何初学者介绍弹簧集成模块..文档似乎非常冗长。 :) 嗯,最典型的就是Cafe Demo:github.com/spring-projects/spring-integration-samples/tree/main/…。您可以找到更多其他示例。但同样:很难有一个简单的教程,因为每个人的用例都不同。您可能需要从理论开始,以更深入地了解什么是消息传递以及这些 EIP 如何适合这样的解决方案:enterpriseintegrationpatterns.com

以上是关于在 spring-integration 中使用有效负载类型路由器通过列表通用有效负载路由消息的主要内容,如果未能解决你的问题,请参考以下文章

测试 Spring-Integration 与订阅者通道

使用spring-integration快速实现mysql分布锁

使用spring-integration快速实现mysql分布锁

使用spring-integration快速实现mysql分布锁

Spring-Integration Webflux 异常处理

使用Spring-Integration获取具有某些字段(投影)的mongodb文档(仅限注释)