我尝试在遗留应用程序的基于xml的配置中使用payload-type-router,该应用程序既不会路由到特定的通道,也不会在该实例中抛出任何错误。我们是否可以使用使用XML配置的有效负载类型路由器来路由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中,这种路由的替代方案是什么?
发布于 2021-10-14 14:34:10
是。我们可以的。我刚刚将项目中的单元测试修改为:
<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>
我在test方法中这样做:
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
。如果你在你的案例中看不到它,那么你会以某种方式吞下它。
https://stackoverflow.com/questions/69565682
复制相似问题