2015-05-07 58 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的讀取方法同步。