控制匯流排

企業整合模式 (EIP) 書籍所述,控制匯流排背後的概念是,相同的訊息傳遞系統可用於監控和管理框架內的組件,如同用於「應用程式層級」訊息傳遞一樣。在 Spring Integration 中,我們以如上所述的配接器為基礎,讓您可以傳送訊息作為調用公開操作的一種方式。

以下範例顯示如何使用 XML 設定控制匯流排

<int:control-bus input-channel="operationChannel"/>

控制匯流排具有一個輸入通道,可用於調用應用程式內容中 Bean 的操作。它也具有服務啟動端點的所有常見屬性。例如,如果操作的結果具有您想要傳送到下游通道的傳回值,則可以指定輸出通道。

控制匯流排在輸入通道上將訊息作為 Spring 運算式語言 (SpEL) 運算式執行。它接收訊息,將主體編譯為運算式,新增一些內容,然後執行它。預設內容支援任何已使用 @ManagedAttribute@ManagedOperation 註解的方法。它也支援 Spring Lifecycle 介面(及其自 5.2 版以來的 Pausable 擴充功能)上的方法,並且它支援用於設定 Spring TaskExecutorTaskScheduler 多種實作的方法。確保您自己的方法可供控制匯流排使用的最簡單方法是使用 @ManagedAttribute@ManagedOperation 註解。由於這些註解也用於將方法公開到 JMX MBean 登錄檔,因此它們提供了一個方便的副產品:通常,您想要公開到控制匯流排的相同類型的操作也適用於透過 JMX 公開)。在典型的 SpEL 語法中實現應用程式內容中任何特定實例的解析。為此,請提供 Bean 名稱以及 Bean 的 SpEL 前綴 (@)。例如,若要在 Spring Bean 上執行方法,用戶端可以將訊息傳送到操作通道,如下所示

Message operation = MessageBuilder.withPayload("@myServiceBean.shutdown()").build();
operationChannel.send(operation)

運算式的內容根目錄是 Message 本身,因此您也可以存取 payloadheaders 作為運算式中的變數。這與 Spring Integration 端點中的所有其他運算式支援一致。

使用 Java 註解,您可以如下設定控制匯流排

@Bean
@ServiceActivator(inputChannel = "operationChannel")
public ExpressionControlBusFactoryBean controlBus() {
    return new ExpressionControlBusFactoryBean();
}

同樣地,您可以如下設定 Java DSL 流程定義

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

如果您偏好使用具有自動 DirectChannel 建立的 Lambda,您可以如下建立控制匯流排

@Bean
public IntegrationFlow controlBus() {
    return IntegrationFlowDefinition::controlBus;
}

在此情況下,通道命名為 controlBus.input