消息桥接器
消息桥接器是一个相对简单的端点,用于连接两个消息通道或通道适配器。
例如,您可能希望将 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"/>
类似的配置适用于其他(可能更有用)通道适配器桥接器,例如文件到 JMS 或邮件到文件。 后续章节将介绍各种通道适配器。
如果桥接器上没有定义“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;
}