【问题标题】:Spring Integration, JMS Inbound channel adaptor and transactionsSpring 集成、JMS 入站通道适配器和事务
【发布时间】:2011-08-29 05:55:41
【问题描述】:

我正在使用配置了 jms:message-driven-channel-adapter 的 SI。我的用例是接收来自队列的消息,通过 JDBC 将其保存到数据库,提交来自队列的消息,然后让此消息根据其类型继续流经各种渠道。如果消息随后出错,这没关系,因为我已将原始消息存储在数据库中,因此可以重播。

我的问题是在数据库持续存在后立即尝试从队列中提交事务。这实际上是中间流程,我只能让 Spring 事务管理尝试在最后正确提交。这是不合适的,因为如果在数据库持久化之后抛出错误,它仍然会将消息留在 JMS 队列中,因为这是外部事务的起源。

那么,有没有一种简单的方法可以从 JMS 队列中提取消息,保存到数据库,然后将其提交出队列并为剩余的流启动一个新事务?

谢谢!

丰富

【问题讨论】:

    标签: java spring jms integration transactionscope


    【解决方案1】:

    您可以将消息保存到数据库中,然后将消息放入可轮询的通道中:

    <channel id="aChannel">
        <queue capacity="10"/>
    </channel>
    

    这将使任何后续流处于新事务中,因为新流将由不同的线程处理 - 基于您与此可轮询通道关联的轮询器。

    【讨论】:

    • 谢谢,这听起来不错。是否可以发送到直接渠道并开始新的交易?基本上我不希望 JMS 输入通道溢出轮询器通道。而是等到流程完成后再从队列中提取另一条消息
    • No Rich,如果您使用直接通道,那么直接通道连接的所有操作都将在同一个执行线程中,在您的情况下,从从队列中提取消息开始,到保存到DB 到后续流程。打破这种情况的一个好方法是在答案之间引入一个缓冲通道,这样就引入了一个新线程(和一个新的事务边界)。您可以使用直接通道以编程方式执行此操作 - 仅在 DB 持久化点使用显式 jms 事务 - 但这可能会变得非常难以处理。
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2014-05-31
    • 2015-07-11
    • 2016-07-19
    • 2015-10-04
    • 2014-12-07
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多