我正在创建一个新的流程并从几乎空的定义开始
@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
答案 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)
...
所以,为了解决你的问题,我们应该有这样的事情:
.wireTap(flow -> flow.handle(System.out::println))
我不知道从Framework的角度来看我们能做些什么。我很确定如果我们提供带有@FunctionalInterface
签名的Lambda,任何基于Object.toString()
的构造都会遇到同样的问题。这只是语法糖IMO的一些令人讨厌的副作用: - )。