我对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
中删除消息OR
1)开始交易 2)阅读消息 3)从QUEUE_SOURCE中删除消息 4)尝试在目标队列QUEUE_TARGET上发布消息,但是失败 5)将消息放回QUEUE_SOURCE
在所有重新启动失败后,将触发回滚。
然而,在这次回滚过程中发生的事让我感到困惑。 我不知道消息最终的位置,它肯定不会在源队列上结束,也不会在错误队列中结束。那么这次回滚过程中究竟发生了什么?
答案 0 :(得分:0)
您需要显示您的确切配置,但您的猜测#1已关闭;代理传递消息但在提交之前不会将其从队列中删除。如果您的代码抛出异常,框架将执行session.rollback()
并且代理将重新发送。如果交付成功,框架将提交事务,然后才会删除该消息。