控制匯流排
如 企業整合模式 (EIP) 書籍所述,控制匯流排背後的概念是,相同的訊息傳遞系統可用於監控和管理框架內的組件,如同用於「應用程式層級」訊息傳遞一樣。在 Spring Integration 中,我們以如上所述的配接器為基礎,讓您可以傳送訊息作為調用公開操作的一種方式。
以下範例顯示如何使用 XML 設定控制匯流排
<int:control-bus input-channel="operationChannel"/>
控制匯流排具有一個輸入通道,可用於調用應用程式內容中 Bean 的操作。它也具有服務啟動端點的所有常見屬性。例如,如果操作的結果具有您想要傳送到下游通道的傳回值,則可以指定輸出通道。
控制匯流排在輸入通道上將訊息作為 Spring 運算式語言 (SpEL) 運算式執行。它接收訊息,將主體編譯為運算式,新增一些內容,然後執行它。預設內容支援任何已使用 @ManagedAttribute
或 @ManagedOperation
註解的方法。它也支援 Spring Lifecycle
介面(及其自 5.2 版以來的 Pausable
擴充功能)上的方法,並且它支援用於設定 Spring TaskExecutor
和 TaskScheduler
多種實作的方法。確保您自己的方法可供控制匯流排使用的最簡單方法是使用 @ManagedAttribute
或 @ManagedOperation
註解。由於這些註解也用於將方法公開到 JMX MBean 登錄檔,因此它們提供了一個方便的副產品:通常,您想要公開到控制匯流排的相同類型的操作也適用於透過 JMX 公開)。在典型的 SpEL 語法中實現應用程式內容中任何特定實例的解析。為此,請提供 Bean 名稱以及 Bean 的 SpEL 前綴 (@
)。例如,若要在 Spring Bean 上執行方法,用戶端可以將訊息傳送到操作通道,如下所示
Message operation = MessageBuilder.withPayload("@myServiceBean.shutdown()").build();
operationChannel.send(operation)
運算式的內容根目錄是 Message
本身,因此您也可以存取 payload
和 headers
作為運算式中的變數。這與 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
。