java - Spring Integration 中最小流的意外行为

标签 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

最佳答案

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

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/

相关文章:

java - 如何从 Android 中的应用程序访问我的相机

java - hibernate中的Session、Connection对象到底是什么

transactions - 为什么 Spring 集成和批处理事务的每个方法( Spring 批处理作业)的默认隔离级别设置为 SERIALIZABLE?

java - 使用 spring 集成下载文件

java - 获取数据报的IP地址 spring-integration

java - 非持久性 JMS 消息是否会重新传送给非持久订阅者?

java - 在 Java 中保留原语常量值得吗?

java - Java 中的 1 行 IF 语句

java - 如何使用FtpInboundFileSynchronizer自动删除本地文件?

spring - 基于 JSON 或 Pipe(|) 的 DSL,用于 Spring Integration 中的动态流生成