12

我使用 SpringBatch 2.1.7 发布核心和基础结构 jar 来读取 CSV 文件并将其保存到数据库。

将我的代码与 Spring 石英调度程序集成以每分钟运行一次,批处理在读写方面工作正常,但失败并出现错误“org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (2 ),当前版本为 1"

由于 Tx 冲突。请建议我如何解决这个问题。

4

3 回答 3

8

我也有同样的例外。

org.springframework.dao.OptimisticLockingFailureException: 
Attempt to update step execution id=0 with wrong version (2), where current version is 3 

在我的情况下,这是由被吞下的过程步骤失败引起的。Spring Batch 激活了 writer,即使处理器发生故障。查看您的日志以确保您的流程步骤正在完成并返回某些内容。

于 2015-06-08T15:31:39.713 回答
3

正如 MattC 所指出的,当我ItemProcessor被窃听时,我遇到了这个错误。出于某种原因,在我的处理器活动期间,它正在关闭与 的数据源连接jobrepository,所以我的例外是:

Encountered an error saving batch meta data for step step1 in job myjob. This job is now in an unknown state and should not be restarted.
org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (1), where current version is 2

在堆栈跟踪结束时,我能够找到:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection is closed.

为了确定问题,首先我隔离了阶段。我构造了一个 NoOpProcessor 和一个 NoOpItemWriter。调整了tasklet,它运行良好。所以我的问题不在于读者。

然后我回滚到我的“完整”ItemWriter 实现,它再次运行良好。所以我的问题不在于作者。当我启用我的“完整”处理器时,错误再次发生。所以,错误就在其中,我开始调试。

所以,不幸的是,我的回答是:调试...

public class NoOpProcessor implements ItemProcessor<Object, Object> {
    @Override
    public Object process(Object arg0) throws Exception {
        System.out.println("Input object: " + Objects.toString(arg0));      
        return arg0;
    }
}

public class NoOpItemWriter implements ItemWriter<Object> {
    @Override
    public void write(List<? extends Object> items) throws Exception {
        if (items != null) {
            System.out.println("Qtty of items to be written: " + items.size());
            for (Object obj : items) {
                System.out.println(Objects.toString(obj));
            }
        } else {
            System.out.println("The items list is null. Nothing to be written.");
        }
    }
}
于 2017-01-24T21:00:22.447 回答
0
于 2019-04-15T14:49:45.410 回答