gpt4 book ai didi

java - Spring批处理ItemReader对同一条记录执行多次

转载 作者:行者123 更新时间:2023-11-30 08:12:56 24 4
gpt4 key购买 nike

我正在尝试实现用于数据库清理的Spring批处理作业。它只是按计划的方式从表中删除条目。

  1. 首先,我们从表中获取 10 行。(ItemReader)
  2. 从表中删除这 10 个条目(ItemWriter)

我已将批处理安排在 15 分钟 间隔。

当我们启动批处理时,令人惊讶的是 10 线程尝试从表中读取数据。

下面是配置。

<!-- spring batch context -->
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="batchTransactionManager" />
</bean>

<bean id="batchTransactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />

<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<!--<property name="taskExecutor">
<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
</property>-->
</bean>

<bean
class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry" />
</bean>

<bean id="jobRegistry"
class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<!-- spring batch context -->



<!--<bean id="completionPolicy" class="org.springframework.batch.repeat.policy.DefaultResultCompletionPolicy"/>-->

<batch:job id="csrfTokenCleanUpBatchJob">
<batch:step id="step">
<tasklet>
<chunk reader="csrfTokenReader" writer="csrfTokenWriter" commit-interval="10"></chunk>
</tasklet>
</batch:step>
</batch:job>

<!-- run every 10 seconds -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="* 0/15 * * * ?" />
</bean>
</property>
</bean>

<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.test.oauth.batch.job.CSRFTokenJobLauncher" />
<property name="group" value="quartz-batch" />
<property name="jobDataAsMap">
<map>
<entry key="jobName" value="csrfTokenCleanUpBatchJob" />
<entry key="jobLocator" value-ref="jobRegistry" />
<entry key="jobLauncher" value-ref="jobLauncher" />
</map>
</property>
</bean>

</beans>

最佳答案

处理每条记录都是经过设计的。 ItemWriter 获取任意数量的记录,但受 commit-interval 约束。你的是1,这意味着每条记录都是单独提交的,我建议你将其设置为50。处理器自行处理每条记录,直到达到提交间隔,然后调用写入器。如前所述,您的值为 1。

另外,将 ItemReader 的 read 方法设置为同步。

关于java - Spring批处理ItemReader对同一条记录执行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30102336/

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