让 spring-batch 与事务性 DMLC 一起工作?

Getting spring-batch to work with transactional DMLC?

我正在尝试设置 jms 消息侦听器,以便它在同一事务中从 JMS 代理 (ActiveMQ) 获取一定数量的消息,如果发生任何错误,事务将回滚以便包含所有消息在该交易中最终进入 DLQ,或者更好的是,不要离开经纪人。

BatchMessageListenerContainer 在 spring-batch-infrastucture-tests repo (https://github.com/spring-projects/spring-batch/tree/master/spring-batch-infrastructure-tests) 下使用 spring-batch 似乎有一个实现涉及各种数据库写入并使用 JDBC 数据源事务管理器。就我而言,我使用的是 JmsTransactionManager

一切似乎都按预期工作,除了一件事,似乎侦听器在每条消息上提交 ActiveMQ 事务,这意味着一旦事务回滚,为时已晚,因为所有消息都已被收集并确认返回给经纪人,因此丢失。

我错过了什么吗?我在这里猜测我需要以某种方式采取额外的步骤来拦截对经纪人的确认并在交易提交后确认一堆,尽管我有点不确定如何去做。

有人能指出我正确的方向吗?

更新:

可以在此处找到跟踪日志:http://pastebin.com/ZurJtSce

7 条消息通过连接到同一个 CachingConnectionFactory(有 JmsTransaction 连接到它)的 JmsTemplate 发送,然后 BatchMessageListenerContainer 开始接收它们,侦听器被编码为抛出异常第 5 条消息。 在收到从第 58 行开始的每条消息时,请注意 ActiveMQSession 提交消息。

确定问题已解决。

事实证明,将 cacheLevel 设置为任何高于 CACHE_CONNECTION 的值都会导致对每条消息进行提交。降低级别似乎已经解决了问题,会话提交现在只在策略规定完成时发生在事务级别。

感谢您的帮助。