我正在创建一个新流程,并从几乎空的定义开始
@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
是函数式接口(interface),因此可以由 Lambda 指定。同时Lambda的参数确实可以发送到System.out.println()
。如果我们将您的 Lambda 转换为接口(interface)实现,我们将看到:
.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))
我不知道从框架的角度我们能做什么。我很确定任何@FunctionalInterface
如果我们提供带有 Object.toString()
的 Lambda,基于基于的构造也会遇到同样的问题。签名。在我看来,这只是语法糖的一些令人讨厌的副作用:-)。
关于java - Spring Integration 中最小流的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45153325/