【问题标题】:Unable to log a error record in DB within ItemProcessListener - onProcessError无法在 ItemProcessListener 中的 DB 中记录错误记录 - onProcessError
【发布时间】:2013-10-02 06:35:37
【问题描述】:

我们已经在使用 Spring 批处理的批处理作业中实现了 ItemProcessListener 和 SkipListener。 我们能够在数据库中记录跳过的项目,而无需创建单独的事务。但是在ItemProcessListener中调用onProcessError方法时,由于对应的Runtime Exception,事务被回滚。

我们在数据库更新的服务接口上使用@Transactional 和传播作为REQUIRES_NEW,但它仍然回滚了事务。

我们的目标是在进程或写入器组件出现错误并且批处理失败时在数据库中记录异常详细信息。如上所述,当我们从覆盖的侦听器中的 onProcessError 方法或 onWriteError 方法触发 DB 插入时,日志记录不起作用。事务被回滚。

我们尝试使用 onProcessError 上的注释创建一个新事务,但它失败了。请为此提供一些输入。

希望这可以解决问题。

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    Spring 配置要求我们启用注解。 可以使用 applicationContext.xml 中的 tx 模式启用注释

    根据 spring 文档, http://docs.spring.io/spring/docs/2.5.6/reference/transaction.html#transaction-declarative-annotation。我们必须包含以下命名空间,

    xmlns:tx="http://www.springframework.org/schema/tx"
    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd

    由于 itemProcessorListener 的 onProcessError 方法与正在处理的块在同一事务中执行,因此该方法在 RollBack 之前调用。使用@Transactional (propagation = Propagation.REQUIRES_NEW) 处理事务会导致创建新事务并将数据持久保存在数据库中。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多