|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
操作符 gateway()
gateway() 运算符在 IntegrationFlow 定义中是一种特殊的服务激活器实现,用于通过其输入通道调用其他端点或集成流程并等待回复。
从技术上讲,它在 <chain> 定义中的作用与嵌套的 <gateway> 组件相同(参见 在链内部调用链),并且允许流程更加简洁和直观。
从逻辑和业务角度来看,它是一个消息网关,用于在目标集成解决方案的不同部分之间分发和复用功能(参见 消息网关)。
该运算符针对不同的目标提供了多种重载形式:
-
gateway(String requestChannel)通过名称向某个端点的输入通道发送消息; -
gateway(MessageChannel requestChannel)通过直接注入向某个端点的输入通道发送消息; -
gateway(IntegrationFlow flow)用于向提供的IntegrationFlow的输入通道发送消息。
所有这些都提供了一个变体,其中第二个 Consumer<GatewayEndpointSpec> 参数用于配置目标 GatewayMessageHandler 以及相应的 AbstractEndpoint。
此外,基于 IntegrationFlow 的方法允许调用现有的 IntegrationFlow Bean,或通过内联 Lambda 将流程声明为子流程(针对 IntegrationFlow 函数式接口),或者将其提取到 private 方法中以获得更简洁的代码风格:
@Bean
IntegrationFlow someFlow() {
return IntegrationFlow
.from(...)
.gateway(subFlow())
.handle(...)
.get();
}
private static IntegrationFlow subFlow() {
return f -> f
.scatterGather(s -> s.recipientFlow(...),
g -> g.outputProcessor(MessageGroup::getOne))
}
如果下游流程并非总是返回回复,您应将 requestTimeout 设置为 0,以防止调用线程无限期挂起。
在这种情况下,流程将在此处结束,并释放该线程以进行后续工作。 |