【问题标题】:Acknowledeging a spring message确认春季消息
【发布时间】:2018-11-22 16:38:41
【问题描述】:

我有一个 spring 集成应用程序,我正在使用消息驱动的通道适配器来使用消息。这是适配器的定义——

<jms:message-driven-channel-adapter id="messageAdapter" destination="inQueue"
                                    connection-factory="connectionFactory"
                                    error-channel="errorChannel"
                                    concurrent-consumers="${consumer.concurrent-consumers}"
                                    acknowledge="transacted"
                                    transaction-manager="transactionManager"
                                    channel="channel"
                                    auto-startup="true"
                                    receive-timeout="50000"/>

所以这条消息进入我的核心频道,然后通过一系列服务激活器。如果出现错误,则此消息将移至 errorChannel,我在其中处理错误并决定需要对该消息执行什么操作。对于一种情况,我希望消息不回滚到队列,这可能吗?我在我的适配器定义中使用“事务处理”,所以我不确定如何驱动这种行为。非常感谢任何帮助!

【问题讨论】:

    标签: spring-integration spring-jms


    【解决方案1】:

    您没有描述transactionManager bean 是什么。如果是JmsTransactionManager,将其删除,容器将只使用本地事务。

    然后,只有error-channel 上的流抛出异常,事务才会回滚。如果该错误流正常退出(“消耗”错误),事务将不会回滚。

    如果是其他事务管理器(例如 JDBC),则将其删除并在流程的稍后部分启动 JDBC 事务(即不同步 JMS 和 JDBC 事务;再次使用本地 JMS 事务)。

    【讨论】:

    • 感谢加里的回复。我正在使用 JPATransaction 管理器,所以我实际上希望如果数据库事务未提交而不是回滚消息到队列。使用上述设置,它工作正常并且消息正在回滚,但对于某些场景,我希望消息不回滚(业务场景)。那么有没有办法阻止某些消息回滚?如果我删除事务管理器,那么所有消息都将停止回滚,所以我希望我必须保留它。
    • 如果两个事务同步,一个不能回滚,另一个不能;这就是同步它们的全部意义所在。请参阅我回答的最后一段;在容器上使用本地事务并在消息流中启动 JPA 事务(在适配器之后,例如使用 @Transactional 网关或使用 channel 上的事务建议)。那么,异常之后,当错误流得到错误时,JMS是提交还是回滚,只取决于错误流做了什么。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2016-01-30
    • 2019-02-04
    • 2018-07-04
    • 2013-03-23
    相关资源
    最近更新 更多