【问题标题】:Some Spring JMS Questions一些 Spring JMS 问题
【发布时间】:2013-06-25 03:25:21
【问题描述】:

我有一个关于 JMS 和 Spring 集成的问题。

我有 3 个队列,我们​​称它们为 QUEUE_SOURCE、QUEUE_TARGET 和 QUEUE_ERROR。 DefaultMessageListenerContainer 用于从 QUEUE_SOURCE 读取消息。

我已经为这些队列配置了一个 JMS 事务管理器。

当我从 QUEUE_SOURCE 读取,但将消息发布到 QUEUE_TARGET 时发生错误,我 可以看到消息重试了几次才抛出异常,触发回滚。

我猜会发生什么:

1) 开始交易 2) 阅读留言 3) 尝试在目标队列 QUEUE_TARGET 上发布消息,但失败 4)不要因为错误而提交,所以消息不会从QUEUE_SOURCE中删除

1) 开始交易 2) 阅读留言 3) 从 QUEUE_SOURCE 中删除消息 4) 尝试在目标队列 QUEUE_TARGET 上发布消息,但失败 5) 将消息放回 QUEUE_SOURCE

所有重新交付失败后,触发回滚。

但是,回滚期间发生的事情让我感到困惑。 我不知道消息在哪里结束,它肯定不会出现在源队列中,也不会出现在错误队列中。那么在回滚期间到底发生了什么?

【问题讨论】:

    标签: spring-integration spring-jms


    【解决方案1】:

    您需要展示您的确切配置,但您的推测 #1 很接近;代理传递消息,但在提交之前不会将其从队列中删除。如果您的代码抛出异常,框架将执行session.rollback() 并且代理将重新交付。如果传递成功,框架将提交事务,然后才会删除消息。

    【讨论】:

    • 感谢您的回答。我想知道的是,回滚期间会发生什么?如果消息在提交之前没有被移除,那么回滚到底做了什么?
    • 实际执行的方式完全取决于代理;解决这个问题是供应商的问题。从逻辑上讲,消息在回滚后重新出现在队列的头部。是否物理移除并重新安装或标记为“进行中”取决于供应商。
    猜你喜欢
    • 2015-11-01
    • 2015-01-22
    • 2017-11-26
    • 1970-01-01
    • 2014-05-06
    • 2011-03-31
    • 2014-09-15
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多