[英]Unexpected behavior of minimal flow in 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
好吧,那确实是出乎意料的。
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);
}
})
如您所见,对于Lambda对于.handle()
的消息确实没有任何要求。
而且您应该在日志中看到类似以下内容的内容:
org.springframework.integration.dsl.IntegrationFlowBuilder@6995bf68
那就是System.out.println(IntegrationFlowDefinition)
SOUT ...
因此,要解决您的问题,我们应该有以下内容:
.wireTap(flow -> flow.handle(System.out::println))
从框架的角度来看,我不知道该怎么办。 我非常确定,如果我们为Lambda提供Object.toString()
签名,则任何基于@FunctionalInterface
的构造都会遇到相同的问题。 那只是语法糖IMO :-)的一些讨厌的副作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.