在 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
。如果你在你的情况下没有看到它,那么你会以某种方式吞下它。
我正在尝试在基于 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
。如果你在你的情况下没有看到它,那么你会以某种方式吞下它。