2015-05-07 31 views
1

我正在尝试执行Spring batch作业进行数据库清理。它只是按计划方式从表中删除条目。对同一条记录执行多次弹簧批量ItemReader

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

我已经安排了一批在15minute间隔。

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

ResourcelessTransactionManager通常用于测试目的;你是否尝试过使用'真正'的交易管理器? –

+0

您能澄清一下您的意思吗?“当我们启动批处理时,令人惊讶的是10个线程尝试从表中读取数据。”? –

回答

1

这是所有设计你想要处理每条记录。 ItemWriter获取尽可能多的记录,但是受commit-interval的约束。你的是1,这意味着每个记录都是单独提交的,我建议你将它设置为50.处理器通过它自己处理每条记录,直到达到提交间隔,然后调用writer。正如你所提到的是1.

此外,使ItemReader的读取方法同步。