0

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

我有 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

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

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

4

1 回答 1

0

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

于 2013-06-27T18:39:47.117 回答