由于网关启动失败,Spring Integration Java DSL IntegrationFlow

时间:2018-10-12 11:37:22

标签: spring-integration spring-integration-dsl

我在Spring Boot应用程序中使用标准Spring @RestController,该应用程序调用Spring Integration以启动消息传递流。据我了解,在这种情况下,Spring Integration的主要目的是使用网关-使用Java DSL似乎有几种不同的方法。

我目前有两种不同的工作方式:

  1. 通过定义带有@MessagingGateway批注的接口。
  2. 通过实例化new GatewayProxyFactoryBean(Consumer.class)并设置频道。

这两种方法都有些笨拙-似乎存在第三种更简洁的方法,它使您不必注释或手动构造GatewayProxyFactoryBean,而只需使用带有bean名称的内置Functional接口。从文档中:

@Bean
public IntegrationFlow errorRecovererFlow() {
    return IntegrationFlows.from(Function.class, "errorRecovererFunction")
            .handle((GenericHandler<?>) (p, h) -> {
                throw new RuntimeException("intentional");
            }, e -> e.advice(null))
            .get();
}


@Autowired
@Qualifier("errorRecovererFunction")
private Function<String, String> errorRecovererFlowGateway;

但是,bean errorRecovererFunction似乎没有注册,并且应用程序无法启动。

Field errorRecovererFlowGateway in MyController required a bean of type 'java.util.function.Function' that could not be found.

我在这里想念东西吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我做了这个申请

@SpringBootApplication
@RestController
public class So52778707Application {

    @Autowired
    @Qualifier("errorRecovererFunction")
    @Lazy
    private Function<String, String> errorRecovererFlowGateway;

    @GetMapping("/errorRecoverer")
    public String getFromIntegrationGateway(@RequestParam("param") String param) {
        return this.errorRecovererFlowGateway.apply(param);
    }

    @Bean
    public IntegrationFlow errorRecovererFlow() {
        return IntegrationFlows.from(Function.class, "errorRecovererFunction")
                .handle((p, h) -> {
                    throw new RuntimeException("intentional");
                })
                .get();
    }

    public static void main(String[] args) {
        SpringApplication.run(So52778707Application.class, args);
    }

}

请注意@Lazy自动装配属性上的errorRecovererFlowGateway批注。关于此注释的文档说:

  

如果要影响某些bean的启动创建顺序,请考虑将其中一些声明为@Lazy(用于首次访问而不是启动时创建)或声明为@DependsOn某些其他bean(确保在当前Bean之前创建特定的其他Bean(超出后者的直接依赖项所暗示的范围之外)。

我认为我们需要在《 Spring Integration参考手册》中阐明,IntegrationFlow解析期间创建的bean不能照原样注入,但是应该考虑使用@Lazy批注来推迟bean解析。