【问题标题】:Getting spring-batch to work with transactional DMLC?让 spring-batch 与事务性 DMLC 一起工作?
【发布时间】:2015-01-28 00:40:23
【问题描述】:

我正在尝试设置 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 实现,但是该实现涉及各种数据库写入并使用 JDBC 数据源事务管理器。就我而言,我使用的是JmsTransactionManager

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

我错过了什么吗?我在这里猜想我需要做一个额外的步骤来拦截对代理的确认,并在事务提交后确认一堆,尽管我有点不确定如何去做。

谁能指出我正确的方向?

更新:

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

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

【问题讨论】:

  • 尝试添加关于如何配置事务管理器,如何分隔事务的代码
  • 嗨克里斯蒂安,你能详细说明一下吗?事务处理似乎正在工作。调试消息显示,每次运行 onmessage 方法时,它都会加入一个现有事务,并且这种情况会一直发生,直到我的 repeatPolicy 说整个事情已经完成,此时它会提交事务。然而,跟踪消息显示来自 ActiveMQSession 类的每条消息都进行了提交
  • 您是否确认该行为实际上与跟踪消息匹配?另外,谁在提供跟踪消息(您可以发布日志)吗?
  • 是的,我查看了错误前后的 ActiveMQ 队列,消息应该在 ActiveMQ DLQ 上,但是只有我的队列存在,它开始时的消息量减去收集的消息量在交易中。这是日志pastebin.com/ZurJtSce 请注意,我发送了 7 条消息,然后启动 BMLC 来接收它们。我的 OnMessage 实现将在第 5 条消息上抛出 JmsException,并且 ActiveMQ 提交可以在每次检索时看到,第 60 行及以后。
  • 进一步检查表明,如果我不使用缓存连接工厂并将我的 BMLC 和 JmsTransaction 管理器都指向 ActiveMQConnectionFactory(也忽略 TxAwareConnectionFactory),则会跳过提交,但是随后调用 consumer.receive()在提交整个事务之前返回 null。我只是迷失了为什么会发生这种情况或如何让 JMS 事务与会话“同步”

标签: java spring jms activemq spring-batch


【解决方案1】:

OK 问题已解决。

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

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多