Java Spring批处理错误写入跳过计数问题

Java Spring批处理错误写入跳过计数问题,java,spring,spring-batch,Java,Spring,Spring Batch,我是SpringBatch的新手,我有一个问题,我的写跳过计数被认为是区块的整个计数,而不仅仅是区块中的无效记录 例如,我正在读取500条记录,块大小为每个块100条记录 然后,如果第一个区块有2条无效记录,则在该无效记录之后的所有记录都将被称为无效,并带有“无效异常”,其中它们不是无效的 因此,批处理步骤执行中的写入跳过计数为100,而不是2 但另一方面,具有无效记录的区块会得到重新处理,除两个无效记录外,所有记录都会正确到达目的地。 功能已实现,但写入跳过计数错误,这使我们无法显示正确的日志

我是SpringBatch的新手,我有一个问题,我的写跳过计数被认为是区块的整个计数,而不仅仅是区块中的无效记录

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

然后,如果第一个区块有2条无效记录,则在该无效记录之后的所有记录都将被称为无效,并带有“无效异常”,其中它们不是无效的

因此,批处理步骤执行中的写入跳过计数为100,而不是2

但另一方面,具有无效记录的区块会得到重新处理,除两个无效记录外,所有记录都会正确到达目的地。 功能已实现,但写入跳过计数错误,这使我们无法显示正确的日志。请告诉我这里缺少什么

我可以看到下面的日志

正在检查是否重新播放:计数=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的卡盘,只跳过错误记录并处理正确的记录。但是跳过写入计数现在不正确,因为它应该只是不正确的记录计数

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

<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>

现在,写入过程中的失败将在一个事务下发生,错误记录将被优雅地处理,并且只有具有的错误记录将被记录在写入跳过计数下的批处理表中