【问题标题】:Spring Integration: Stategies for avoiding lost messagesSpring Integration:避免丢失消息的策略
【发布时间】:2014-03-24 23:09:14
【问题描述】:

如果使用任务执行器定义了 Spring Integration 通道,则将使用线程池来处理传入的消息。如果服务激活器或转换器端点组件从该内部通道接收消息,则端点组件池将被实例化,每个线程一个?如果这不是默认行为,需要什么配置才能实现?

这很重要,原因有两个:

  1. 这样接收消息的服务激活器/转换器不会成为瓶颈。

  2. 确保端点组件在内部通道使用的同一线程中处理消息,因此它们是同一事务的一部分。如果是这种情况并且使用 JMS 持久化通道,则消息不会丢失。否则,如果端点在单独的事务中运行,那么如果在将消息传递到端点组件后出现 JVM 故障,则消息被持久保存在通道上的事实将无济于事。

谢谢

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    没有;无论输入通道中的线程如何,每个端点都有一个实例。

    1. 您可以通过精心设计服务来避免“瓶颈”,通常是使其无状态。
    2. 不清楚你的意思;如果通道由 JMS 支持,则输出端的每个线程都可以获得自己的事务,并且在服务失败时消息将回滚到队列中。这与简单的 executor channel 完全不同(事务永远无法工作,并且拥有单独的实例也无济于事)。

    也许如果你能描述一个特定的用例/配置,有人可以提供一些建议。

    【讨论】:

    • 这是一个澄清我的问题的例子:
    • 这里有一个例子来澄清我的问题:内部通道是用任务执行器定义的。消息由轮询数据库的入站通道适配器放置在通道上。然后转换器从内部通道接收消息。我的理解是,内部(执行者)通道不会成为任何先前交易的一部分,但它将开始一个新的交易,其中包括转换器。在这种情况下,即使通道将消息移交给 Transformer 后出现故障,消息也不会丢失。这是正确的吗?
    • 为了澄清上述,当我说消息将被持久化并且不会丢失时,我指的是由 jms () 支持的执行器通道
    • 再次,您将执行程序通道与 jms 支持的通道混淆了。一个执行器通道只是简单地移交给另一个线程;事务语义取决于通道下游的任何内容(@Transactional 方法、事务网关等)。使用 JMS 支持的通道,可以将其配置为使用事务,事务从队列中检索消息开始,并且在发生故障时不会丢失。
    • 非常感谢。因此 将启动一个新事务,其中将包括下游端点(服务过滤器、转换器等)。如果出现系统故障,即使在消息被移交给端点之后,消息也不会丢失,因为 JMS 提供者(如果这样配置)已经持久化了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2013-11-13
    • 2013-02-27
    相关资源
    最近更新 更多