gpt4 book ai didi

java - Spring批处理不正确的写入跳过计数问题

转载 作者:行者123 更新时间:2023-11-30 06:50:52 25 4
gpt4 key购买 nike

我是 Spring Batch 的新手,我遇到一个问题,即我的写入跳过计数被视为 block 的整个计数,而不仅仅是 block 中的无效记录。

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

然后,如果第一个 block 有 2 个无效记录,则该无效记录之后的所有记录都将被称为无效并带有“无效异常”,而它们并非无效。

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

但另一方面,含有无效记录的 block 会被重新处理,除了两条无效记录外,所有记录都正确到达目的地。功能已实现,但 write_skip_count 错误,这阻止我们显示正确的日志。请提出我在这里缺少的内容。

我可以看到下面的日志,

Checking for rethrow: count=1

Rethrow in retry for policy: count=1

Initiating transaction rollback on application exception

下面是我们迄今为止尝试过的代码片段,

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

最佳答案

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

在这种情况下,批处理会失败整个 block ,并且跳过计数变为 block 大小。但它稍后会以提交间隔 = 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>

现在,在一个事务下将发生写入期间的失败,并且错误记录将被妥善处理,并且只有错误记录才会在写入跳过计数下记录在批处理表中。

关于java - Spring批处理不正确的写入跳过计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42803941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com