我正在尝试设置jms消息监听器,以便它从同一事务中的JMS代理(ActiveMQ)中获取一定数量的消息,并且如果发生任何错误,则事务将回滚,以便包含在其中的所有消息交易最终在DLQ中,或者更好的是,不要离开经纪人。
在spring-batch-infrastucture-tests repo(https://github.com/spring-projects/spring-batch/tree/master/spring-batch-infrastructure-tests)下使用spring-batch似乎有一个BatchMessageListenerContainer
的实现,但是该实现涉及DB编写的各种类并使用JDBC数据源事务管理器。就我而言,我使用的是JmsTransactionManager
。
似乎所有东西都按预期工作,除了一件事,似乎监听器在每条消息上提交ActiveMQ事务,这意味着一旦事务回滚,由于所有消息都已被收集并且确认回到经纪人,因此失去了。
我错过了什么吗?我猜这里我需要做一个额外的步骤来拦截对代理的确认,并在事务提交后确认一堆,虽然我对如何去做有点不确定。
有人能指出我正确的方向吗?
更新:
可以在此处找到跟踪日志:http://pastebin.com/ZurJtSce
7个消息通过连接到同一个CachingConnectionFactory的JmsTemplate发送(其中JmsTransaction连接到它)然后启动BatchMessageListenerContainer
来接收它们,并且侦听器被编码为在5日引发异常信息。
请注意从第58行开始接收每条消息时的ActiveMQSession提交消息。
答案 0 :(得分:0)
确定问题已解决。
事实证明,将cacheLevel设置为高于CACHE_CONNECTION将导致每条消息的提交。降低级别似乎已经解决了问题,并且会话提交现在只在策略显示完成时才会发生在事务级别上。
感谢您的帮助。