消息桥接

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

通过在两个通道之间提供一个中介 Poller,您可以使用消息桥接来限制入站消息。Poller 的触发器决定了消息到达第二个通道的速率,而 Poller 的 maxMessagesPerPoll 属性强制限制了吞吐量。

消息桥接的另一个有效用途是连接两个不同的系统。在这种场景下,Spring Integration 的作用仅限于在这些系统之间建立连接,并在必要时管理 Poller。通常,在两个系统之间至少会有一个 Transformer 用于转换它们之间的格式。在这种情况下,通道可以作为 Transformer 端点的 'input-channel' 和 'output-channel' 提供。如果不需要数据格式转换,则消息桥接可能确实足够了。

使用 XML 配置桥接

您可以使用 <bridge> 元素在两个消息通道或通道适配器之间创建一个消息桥接。为此,需要提供 input-channeloutput-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 命名空间中 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"/>

类似的配置也适用于其他(可能更有用)的通道适配器桥接,例如 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;
}

使用 Java DSL 配置桥接

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

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