9

如果表达式值与任何映射都不匹配,我想使用 Spring Integration 来实现使用默认输出通道的基于内容的路由器。这是我的bean定义:

<int:router input-channel="channel_in" default-output-channel="channel_default" expression="payload.name">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />

但是,似乎从未使用过默认输出通道。如果表达式计算结果为“baz”,则路由器似乎正在寻找名为“baz”的频道,而不是路由到“channel_default”频道:

org.springframework.integration.MessagingException: failed to resolve channel name 'baz'
  Caused by: org.springframework.integration.support.channel.ChannelResolutionException: 
    failed to look up MessageChannel bean with name 'baz'
  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No bean named 'baz' is defined

使用 XML 命名空间是我想要的,还是我需要编写自己的实现?

4

3 回答 3

10

事实证明,要完成这项工作,我所要做的就是将路由器的 ignore-channel-name-resolution-failures 属性设置为 false:

<int:router input-channel="channel_in" default-output-channel="channel_default" 
  expression="payload.name" ignore-channel-name-resolution-failures="true">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />
</int:router>

我以为我以前尝试过,但我似乎没有。

于 2011-07-27T15:27:06.137 回答
1

参考文档中所述:

从 Spring Integration 2.1 开始,路由器参数在所有路由器实现中都更加标准化。因此,一些小的更改可能会破坏旧的基于 Spring Integration 的应用程序。

从 Spring Integration 2.1 开始,该 ignore-channel-name-resolution-failures属性被删除,以便将其行为与该resolution-required属性合并。此外,resolution-required 属性现在默认为true.

在这些更改之前,该resolution-required属性默认为 false,当没有解析通道并且default-output-channel设置 no 时,会导致消息被静默丢弃。新行为需要至少一个已解析的通道,并且默认情况下, MessageDeliveryException如果没有确定通道(或尝试发送不成功),则抛出一个。

如果您确实希望静默发送消息,您可以设置 default-output-channel="nullChannel".

如果您使用的是 Java DSL,则配置可能如下所示:

IntegrationFlows.from("process")
        .<JobExecution, String>route(m -> m.getExitStatus().getExitCode(),
                m -> m.channelMapping(ExitStatus.COMPLETED.getExitCode(), "succeed")
                        .defaultOutputChannel("failed")
                        .resolutionRequired(false))
        .get();
于 2019-07-11T11:56:26.977 回答
0

如果您使用的是 Spring Boot 2.1.2.RELEASE

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-integration</artifactId>
</dependency>

然后需要 resolution-required="false"而不是 ignore-channel-name-resolution-failures。

<int:router input-channel="channel_in" default-output-channel="channel_default" 
  expression="payload.name" resolution-required="false">
    <int:mapping value="foo" channel="channel_one" />
    <int:mapping value="bar" channel="channel_two" />
</int:router>
于 2019-06-07T16:08:54.277 回答