Spring Integration中最小流量的意外行为

时间:2017-07-17 20:41:31

标签: java spring-integration

我正在创建一个新的流程并从几乎空的定义开始

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlows
            .from(routerInputChannel())
            .channel(routerOutputChannel())
            .get();
}

到目前为止一切顺利。但是如果我添加简单的wireTap线

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlows
            .from(routerInputChannel())
            .wireTap(m -> System.out.println(m))
            .channel(routerOutputChannel())
            .get();
}

我收到了异常

Caused by: org.springframework.beans.factory.BeanCreationException: The 'IntegrationFlow' can't consist of only one 'MessageChannel'. Add at lest '.bridge()' EIP-method before the end of flow.
    at org.springframework.integration.dsl.IntegrationFlowDefinition.get(IntegrationFlowDefinition.java:2670)
    at org.springframework.integration.dsl.IntegrationFlowBuilder.get(IntegrationFlowBuilder.java:26)
    at org.springframework.integration.dsl.IntegrationFlowDefinition.wireTap(IntegrationFlowDefinition.java:329)
    at org.springframework.integration.dsl.IntegrationFlowDefinition.wireTap(IntegrationFlowDefinition.java:263)
    at com.xxx.xxx.xxx.xxx.config.RootConfiguration.routerFlow(RootConfiguration.java:29)

这种例外的原因是什么?

我使用Spring Integration 4.3.7.RELEASE 和Spring Integration Java DSL 1.1.4.RELEASE

1 个答案:

答案 0 :(得分:3)

嗯,这确实是出乎意料的。

wireTap()有签名:

public B wireTap(IntegrationFlow flow) {

其中IntegrationFlow是功能接口,因此可以由Lambda指定。同时,Lambda的参数可以真正发送到System.out.println()。如果我们将您的Lambda转换为接口实现,我们将看到:

.wireTap(new IntegrationFlow() {

        @Override
        public void configure(IntegrationFlowDefinition<?> x) {
            System.out.println(x);
        }

})

正如您所看到的那样,您对.handle()的Lambda所期望的消息一无所知。

你应该在日志中看到类似的内容:

org.springframework.integration.dsl.IntegrationFlowBuilder@6995bf68

这正是System.out.println(IntegrationFlowDefinition) ...

的SOUT

所以,为了解决你的问题,我们应该有这样的事情:

.wireTap(flow -> flow.handle(System.out::println))

我不知道从Framework的角度来看我们能做些什么。我很确定如果我们提供带有@FunctionalInterface签名的Lambda,任何基于Object.toString()的构造都会遇到同样的问题。这只是语法糖IMO的一些令人讨厌的副作用: - )。