在 spring-integration 中使用 payload-type-router 使用 List Generic payloads 路由消息

Routing the message with List Generic payloads using payload-type-router in spring-integration

我正在尝试在基于 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 中这种路由的替代方案是什么?

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

<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.");
        }
    }

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