如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

消息桥接

消息桥接是一个相对简单的端点,用于连接两个消息通道或适配器。 例如,您可能希望将一个PollableChannel连接到一个SubscribableChannel,以便订阅的端点不需要担心任何轮询配置。 相反,消息桥接提供这些轮询配置。spring-doc.cadn.net.cn

通过在两个通道之间提供一个中介探测器,您可以通过消息桥来限制流入的消息速率。 探测器的触发器决定了到达第二个通道的消息率,并且探测器的maxMessagesPerPoll属性强制执行吞吐量上限。spring-doc.cadn.net.cn

消息桥接的另一个有效用途是连接两个不同的系统。 在这种场景下,Spring Integration 的作用仅限于在这些系统之间建立连接并管理轮询器(如果必要的话)。 更常见的情况是在这两个系统之间至少配置一个转换器,以在它们的格式之间进行转换。 在这种情况下,通道可以作为转换器端点的 'input-channel'(输入通道)和 'output-channel'(输出通道)提供。 如果不需要数据格式转换,那么消息桥接本身可能就足够了。spring-doc.cadn.net.cn

使用 XML 配置桥接

可以使用<bridge>元素来创建两个消息通道或适配器之间的消息桥接。 要实现这一点,请提供input-channeloutput-channel属性,如下例所示:spring-doc.cadn.net.cn

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

正如前面所述,消息桥接器的一个常见用例是将一个PollableChannel连接到一个SubscribableChannel。 在此角色中执行时,消息桥接器也可能充当流量控制器:spring-doc.cadn.net.cn

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

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

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

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

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

类似的配置同样适用于其他(可能更实用的)Channel Adapter桥梁,例如文件到JMS或邮件到文件。 后续章节将涵盖各种Channel Adapter。spring-doc.cadn.net.cn

如果桥接(bridge)中没有定义 'output-channel',则会使用入站消息提供的回复通道(reply channel),如果可用的话。 如果没有提供输出通道(output channel)或回复通道,则会抛出异常。

使用 Java 配置桥接

以下示例展示了如何使用@0注解在Java中配置一个桥接器:spring-doc.cadn.net.cn

@Bean
public PollableChannel polled() {
    return new QueueChannel();
}

@Bean
@BridgeFrom(value = "polled", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "10"))
public SubscribableChannel direct() {
    return new DirectChannel();
}

以下示例展示了如何使用@0注解在Java中配置一个桥接器:spring-doc.cadn.net.cn

@Bean
@BridgeTo(value = "direct", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "10"))
public PollableChannel polled() {
    return new QueueChannel();
}

@Bean
public SubscribableChannel direct() {
    return new DirectChannel();
}

可以使用BridgeHandler,如以下示例所示:spring-doc.cadn.net.cn

@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)来配置桥接器,如下例所示:spring-doc.cadn.net.cn

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