Spring批次错误写入跳过计数问题

时间:2017-03-15 07:56:32

标签: java spring spring-batch

我是初次批处理的新手,我遇到一个问题,即我的写入跳过计数被视为整个块数,而不仅仅是块中的无效记录。

例如,我正在阅读500条记录,每块大小为100条记录。

然后,如果第一个块有2个无效记录,则该无效记录之后的所有记录都被称为无效,并且“无效异常”,因为它们不是无效的。

因此,batch_step_execution中的write_skip_count对于该批次而言为100,而不是2。

但另一方面,具有无效记录的块被重新处理,除了两个无效之外,所有记录都正确到达目的地。 实现了功能,但write_skip_count是错误的,这阻止我们显示正确的日志。请提出我在这里缺少的信息。

我可以看到下面的日志,

  

检查重新抛出:count = 1

     

重试政策时重新投入:计数= 1

     

启动应用程序异常的事务回滚

以下是我们到目前为止尝试的代码段

<batch:step id="SomeStep">
    <batch:tasklet>
        <batch:chunk reader="SomeStepReader"
            writer="SomeWriter" commit-interval="1000"
            skip-limit="1000" retry-limit="1">
            <batch:skippable-exception-classes>
                <batch:include class="org.springframework.dao.someException" />
            </batch:skippable-exception-classes>
            <batch:retryable-exception-classes>
                <batch:exclude class="org.springframework.dao.someException"/>
            </batch:retryable-exception-classes>
        </batch:chunk>
    </batch:tasklet>
</batch:step>

1 个答案:

答案 0 :(得分:1)

尝试了一段时间后。我发现当写入数据库时​​发生在块中并且没有该数据库的事务管理器,特别是当您的批处理作业从一个数据库数据源读取并写入另一个数据库数据源时。

在这种情况下,批处理会使整个块失败并且跳过计数变为块大小。但是它稍后用commit interval = 1处理chuck并且只跳过错误的记录并处理正确的记录。但跳过写入计数现在不正确,因为它应该只是不正确的记录计数。

为避免这种情况,请为正在写入数据的数据库数据源创建一个事务管理器。

<bean id="SometransactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="SomedataSource" />
</bean>

然后在所有交易发生的步骤中使用交易管理器,

<batch:step id="someSlaveStep">
    <batch:tasklet  transaction-manager="SometransactionManager">
        <batch:chunk reader="SomeJDBCReader"
            writer="SomeWriterBean" commit-interval="1000"
            skip-limit="1000">
            <batch:skippable-exception-classes>
                <batch:include class="java.lang.Exception" />
            </batch:skippable-exception-classes>
            <batch:listeners>  
                      <batch:listener ref="SomeSkipHandler" />  
            </batch:listeners>
        </batch:chunk>
    </batch:tasklet>
</batch:step>

现在这里写入失败将在一个事务下发生,错误的记录将被正常处理,只有错误的记录在写入跳过计数下记录批处理表。