对于最新稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

线障

有时,我们需要暂停消息流线程,直到发生其他异步事件。 例如,考虑一个向RabbitMQ发布消息的HTTP请求。 我们可能希望在RabbitMQ经纪人收到消息确认之前不回复用户。spring-doc.cadn.net.cn

在4.2版本中,Spring Integration引入了<屏障/>组件用于此目的。 基础消息处理器障碍信息处理者. 该类还实现了消息触发动作,其中一条消息传递给触发()方法释放对应的线程handleRequestMessage()方法(如果存在的话)。spring-doc.cadn.net.cn

悬挂线程和触发线程通过调用相关策略在消息里。 当消息发送到输入通道,线程悬挂至最多请求超时毫秒,等待相应的触发信息。 默认相关策略使用IntegrationMessageHeaderAccessor.CORRELATION_ID页眉。 当触发消息与其相关性相同时,线程被释放。 发送给输出通道释放后通过使用消息组处理器. 默认情况下,消息是收藏<?>两个有效载荷中,头部通过DefaultAggregatingMessageGroupProcessor.spring-doc.cadn.net.cn

如果触发()方法首先被调用(或主线程超时后),它会被暂停,时间最多为触发超时等待暂停信息的到来。 如果你不想暂停触发线程,可以考虑把它交给任务执行者而是让其螺丝悬浮。
在之前的5.4版本中,只有一个超时请求消息和触发消息都有选项,但在某些使用场景中,这些动作最好设置不同的超时时间。 因此请求超时触发超时已经引入了多种选项。

需要回复属性决定了如果暂停线程在触发消息到达前超时,应采取的作。 默认情况下,它是false,这意味着端点返回,流结束,线程返回调用者。 什么时候true一个回复必需例外被抛出。spring-doc.cadn.net.cn

你可以打电话给触发()程序化方法(通过使用名称获取豆子引用,障碍。处理者——其中障碍是势垒端点的豆名)。 或者,你可以配置一个<出站通道适配器/>触发释放。spring-doc.cadn.net.cn

只有一个线程可以被悬挂,且相关性相同。 相同的相关性可以多次使用,但只能同时使用一次。 如果第二个线程到达且具有相同相关性,则抛出异常。

以下示例展示了如何使用自定义头部进行关联:spring-doc.cadn.net.cn

@ServiceActivator(inputChannel="in")
@Bean
public BarrierMessageHandler barrier(MessageChannel out, MessageChannel lateTriggerChannel) {
    BarrierMessageHandler barrier = new BarrierMessageHandler(10000);
    barrier.setOutputChannel(out());
    barrier.setDiscardChannel(lateTriggerChannel);
    return barrier;
}

@ServiceActivator (inputChannel="release")
@Bean
public MessageHandler releaser(MessageTriggerAction barrier) {
    return barrier::trigger;
}
<int:barrier id="barrier1" input-channel="in" output-channel="out"
        correlation-strategy-expression="headers['myHeader']"
        output-processor="myOutputProcessor"
        discard-channel="lateTriggerChannel"
        timeout="10000">
</int:barrier>

<int:outbound-channel-adapter channel="release" ref="barrier1.handler" method="trigger" />

根据哪个节点先收到消息,要么是发送消息的线程或者发送消息的线程释放等待最多十秒,直到另一条消息到达。 当消息被释放时,通道会发送一条消息,结合调用自定义结果消息组处理器比恩,名字我的输出处理器. 如果主线程超时且触发器较晚到达,你可以配置一个丢弃通道,延迟触发器被发送到那里。 如果请求消息未能及时到达,触发消息也会被丢弃。spring-doc.cadn.net.cn

关于该组件的示例,请参见屏障 Samples的应用spring-doc.cadn.net.cn