訊息橋接器
訊息橋接器是一個相對簡單的端點,用於連接兩個訊息通道或通道配接器。例如,您可能希望將 PollableChannel
連接到 SubscribableChannel
,以便訂閱端點不必擔心任何輪詢設定。取而代之的是,訊息橋接器提供輪詢設定。
透過在兩個通道之間提供中介輪詢器,您可以使用訊息橋接器來節流輸入訊息。輪詢器的觸發器決定訊息到達第二個通道的速率,而輪詢器的 maxMessagesPerPoll
屬性則強制執行吞吐量的限制。
訊息橋接器的另一個有效用途是連接兩個不同的系統。在這種情況下,Spring Integration 的角色僅限於建立這些系統之間的連線並在必要時管理輪詢器。更常見的做法是在兩個系統之間至少有一個轉換器,以在它們的格式之間進行轉換。在這種情況下,通道可以作為轉換器端點的 'input-channel' 和 'output-channel' 提供。如果不需要資料格式轉換,則訊息橋接器可能確實足夠。
使用 XML 設定橋接器
您可以使用 <bridge>
元素來建立兩個訊息通道或通道配接器之間的訊息橋接器。為此,請提供 input-channel
和 output-channel
屬性,如下列範例所示
<int:bridge input-channel="input" output-channel="output"/>
如上所述,訊息橋接器的常見用例是將 PollableChannel
連接到 SubscribableChannel
。在執行此角色時,訊息橋接器也可以作為節流器
<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
配接器之間的簡單「echo」
<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',則會使用輸入訊息提供的回覆通道(如果可用)。如果輸出通道和回覆通道都不可用,則會擲回例外。 |
使用 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;
}