運算子 gateway()

IntegrationFlow 定義中,gateway() 運算子是一種特殊的服務啟用器實現,用於透過其輸入通道呼叫其他端點或整合流,並等待回覆。從技術上講,它扮演的角色與 <chain> 定義中巢狀的 <gateway> 元件相同(參見 在 Chain 中呼叫 Chain),並使得流更加清晰和直接。從邏輯和業務角度來看,它是一個訊息閘道器,允許在目標整合解決方案的不同部分之間分發和重用功能(參見 訊息閘道器)。該運算子有幾個過載,用於不同的目的:

  • gateway(String requestChannel):透過名稱將訊息傳送到某個端點的輸入通道;

  • gateway(MessageChannel requestChannel):透過直接注入將訊息傳送到某個端點的輸入通道;

  • gateway(IntegrationFlow flow):將訊息傳送到提供的 IntegrationFlow 的輸入通道。

所有這些過載都含有一個帶有第二個 Consumer<GatewayEndpointSpec> 引數的變體,用於配置目標 GatewayMessageHandler 和相應的 AbstractEndpoint。此外,基於 IntegrationFlow 的方法允許呼叫現有的 IntegrationFlow Bean,或透過 IntegrationFlow 函式式介面的內聯 lambda 將流宣告為子流,或將其提取到 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,以防止呼叫執行緒無限期掛起。在這種情況下,流將在該點結束,並釋放執行緒以進行後續工作。