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

时间:2015-05-07 13:21:02

标签: java spring quartz-scheduler spring-batch

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

  1. 首先我们从表中获取10行。(ItemReader
  2. 从表格中删除这10个条目(ItemWriter
  3. 我已按15 minute间隔安排了批次。

    当我们启动批处理时,令人惊讶的是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>
    

1 个答案:

答案 0 :(得分:1)

您希望处理每条记录。 ItemWriter可以获得所需数量的记录,但受commit-interval的约束。你的是1,这意味着每个记录都是单独提交的,我建议你把它设置为50.处理器自己处理每个记录,直到达到提交间隔,然后调用编写器。如上所述,你的是1。

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