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

Spring batch ItemReader executing multiple times for same record

我正在尝试为数据库 cleanup.It 执行 Spring batch 作业,只是按预定方式从 table 中删除条目。

  1. 首先我们从 table.(ItemReader)
  2. 中获取 10 行
  3. 正在从 table(ItemWriter)
  4. 中删除这 10 个条目

我已安排 15 minute 间隔的批次。

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

配置如下

<!-- 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的读取方法