訊息橋接
訊息橋接是一個相對簡單的端點,用於連線兩個訊息通道或通道介面卡。例如,您可能想要將一個 PollableChannel
連線到一個 SubscribableChannel
,這樣訂閱端點就不必擔心任何輪詢配置。相反,訊息橋接提供了輪詢配置。
透過在兩個通道之間提供一箇中介 Poller,您可以使用訊息橋接來限制入站訊息。Poller 的觸發器決定了訊息到達第二個通道的速率,而 Poller 的 maxMessagesPerPoll
屬性強制限制了吞吐量。
訊息橋接的另一個有效用途是連線兩個不同的系統。在這種場景下,Spring Integration 的作用僅限於在這些系統之間建立連線,並在必要時管理 Poller。通常,在兩個系統之間至少會有一個 Transformer 用於轉換它們之間的格式。在這種情況下,通道可以作為 Transformer 端點的 'input-channel' 和 'output-channel' 提供。如果不需要資料格式轉換,則訊息橋接可能確實足夠了。
使用 XML 配置橋接
您可以使用 <bridge>
元素在兩個訊息通道或通道介面卡之間建立一個訊息橋接。為此,需要提供 input-channel
和 output-channel
屬性,如下例所示
<int:bridge input-channel="input" output-channel="output"/>
如上所述,訊息橋接的一個常見用例是將一個 PollableChannel
連線到一個 SubscribableChannel
。在執行此角色時,訊息橋接也可以用作節流器 (throttler)。
<int:bridge input-channel="pollable" output-channel="subscribable">
<int:poller max-messages-per-poll="10" fixed-rate="5000"/>
</int:bridge>
您可以使用類似的機制連線通道介面卡。以下示例展示了 Spring Integration 的 stream
名稱空間中 stdin
和 stdout
介面卡之間的簡單“回顯”功能。
<int-stream:stdin-channel-adapter id="stdin"/>
<int-stream:stdout-channel-adapter id="stdout"/>
<int:bridge id="echo" input-channel="stdin" output-channel="stdout"/>
類似的配置也適用於其他(可能更有用)的通道介面卡橋接,例如 file-to-JMS 或 mail-to-file。後續章節將介紹各種通道介面卡。
如果在橋接上未定義 'output-channel',則在可用時使用入站訊息提供的回覆通道。如果 output 或 reply 通道均不可用,則丟擲異常。 |
使用 Java 配置橋接
以下示例展示瞭如何使用 @BridgeFrom
註解在 Java 中配置橋接
@Bean
public PollableChannel polled() {
return new QueueChannel();
}
@Bean
@BridgeFrom(value = "polled", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "10"))
public SubscribableChannel direct() {
return new DirectChannel();
}
以下示例展示瞭如何使用 @BridgeTo
註解在 Java 中配置橋接
@Bean
@BridgeTo(value = "direct", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "10"))
public PollableChannel polled() {
return new QueueChannel();
}
@Bean
public SubscribableChannel direct() {
return new DirectChannel();
}
或者,您可以使用 BridgeHandler
,如下例所示
@Bean
@ServiceActivator(inputChannel = "polled",
poller = @Poller(fixedRate = "5000", maxMessagesPerPoll = "10"))
public BridgeHandler bridge() {
BridgeHandler bridge = new BridgeHandler();
bridge.setOutputChannelName("direct");
return bridge;
}