跳到主要内容

消息桥接

QWen Plus 中英对照 Messaging Bridge

消息桥接器是一个相对简单的端点,用于连接两个消息通道或通道适配器。例如,您可能想要连接一个 PollableChannel 到一个 SubscribableChannel ,这样订阅的端点就不用关心任何轮询配置。相反,消息桥接器提供了轮询配置。

通过在两个通道之间提供一个中间轮询器,你可以使用消息桥来限制传入的消息。轮询器的触发器决定了消息以何种速率到达第二个通道,而轮询器的 maxMessagesPerPoll 属性则对吞吐量进行限制。

另一种消息桥的有效用法是连接两个不同的系统。在这样的场景中,Spring Integration 的角色仅限于在这两个系统之间建立连接并根据需要管理轮询器。更常见的情况可能是在两个系统之间至少有一个转换器,用于在它们的格式之间进行转换。在这种情况下,通道可以作为转换器端点的 'input-channel' 和 'output-channel' 提供。如果不需要数据格式转换,那么消息桥确实可能就足够了。

使用 XML 配置桥接

你可以使用 <bridge> 元素来创建两个消息通道或通道适配器之间的消息桥。为此,请提供 input-channeloutput-channel 属性,如下例所示:

<int:bridge input-channel="input" output-channel="output"/>
xml

如上所述,消息桥的一个常见用例是将 PollableChannel 连接到 SubscribableChannel。在执行此角色时,消息桥还可以充当节流器:

<int:bridge input-channel="pollable" output-channel="subscribable">
<int:poller max-messages-per-poll="10" fixed-rate="5000"/>
</int:bridge>
xml

你可以使用类似的机制来连接通道适配器。以下示例展示了 Spring Integration 的 stream 命名空间中的 stdinstdout 适配器之间的简单“回显”:

<int-stream:stdin-channel-adapter id="stdin"/>

<int-stream:stdout-channel-adapter id="stdout"/>

<int:bridge id="echo" input-channel="stdin" output-channel="stdout"/>
xml

类似的配置也适用于其他(可能更有用的)Channel Adapter 桥接,例如文件到 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();
}
java

以下示例展示了如何使用 @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();
}
java

或者,你可以使用 BridgeHandler,如下例所示:

@Bean
@ServiceActivator(inputChannel = "polled",
poller = @Poller(fixedRate = "5000", maxMessagesPerPoll = "10"))
public BridgeHandler bridge() {
BridgeHandler bridge = new BridgeHandler();
bridge.setOutputChannelName("direct");
return bridge;
}
java

使用 Java DSL 配置桥接

你可以使用 Java 领域特定语言(DSL)来配置桥接,如下例所示:

@Bean
public IntegrationFlow bridgeFlow() {
return IntegrationFlow.from("polled")
.bridge(e -> e.poller(Pollers.fixedDelay(5000).maxMessagesPerPoll(10)))
.channel("direct")
.get();
}
java