IntegrationFlow 作为网关

IntegrationFlow 可以从提供 GatewayProxyFactoryBean 组件的服务接口开始,如下例所示

public interface ControlBusGateway {

    void send(String command);
}

...

@Bean
public IntegrationFlow controlBusFlow() {
    return IntegrationFlow.from(ControlBusGateway.class)
            .controlBus()
            .get();
}

接口方法的所有代理都提供通道,以将消息发送到IntegrationFlow 中的下一个集成组件。您可以使用@MessagingGateway 注解标记服务接口,并使用@Gateway 注解标记方法。但是,requestChannel 将被忽略并被IntegrationFlow 中下一个组件的内部通道覆盖。否则,使用IntegrationFlow 创建这样的配置是没有意义的。

默认情况下,GatewayProxyFactoryBean 获取常规 bean 名称,例如[FLOW_BEAN_NAME.gateway]。您可以使用@MessagingGateway.name() 属性或重载的IntegrationFlow.from(Class<?> serviceInterface, Consumer<GatewayProxySpec> endpointConfigurer) 工厂方法更改该 ID。此外,接口上@MessagingGateway 注解的所有属性都将应用于目标GatewayProxyFactoryBean。当注解配置不可用时,可以使用Consumer<GatewayProxySpec> 变体为目标代理提供合适的选项。此 DSL 方法从 5.2 版本开始可用。

使用 Java 8,您甚至可以使用java.util.function 接口创建集成网关,如下例所示

@Bean
public IntegrationFlow errorRecovererFlow() {
    return IntegrationFlow.from(Function.class, (gateway) -> gateway.beanName("errorRecovererFunction"))
            .<Object>handle((p, h) -> {
                throw new RuntimeException("intentional");
            }, e -> e.advice(retryAdvice()))
            .get();
}

errorRecovererFlow 可以按如下方式使用

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