2012-07-04 43 views
1

我有一個SpringBatch應用程序,我們正在嘗試並行處理。在批處理中,它從表中讀取並用響應更新另一個表。如果輸入表中有100條記錄,則輸出表也應該有100條記錄。SimpleAsyncTaskExecutor與SpringBatch中的SyncTaskExecutor

現在,我在輸入表中有13600條記錄。當我嘗試使用SyncTaskExecutor時,只有一個線程正在運行,輸出表獲得了13600條記錄。當我嘗試SimpleAsyncTaskExecutor時,輸出表中只有900條記錄。

工作如下聲明:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:task="http://www.springframework.org/schema/task" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd 
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"> 

<import resource="applicationContext.xml" /> 


<bean id="itemReader" 
    class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql" value="select REP_QMUT_KEY, DLN_DLNRNR, DLN_AFVDAT, F_IND_MEMO_DVB, MUT_MUTDAT_UM, MUT_VERWDAT_UM, MUT_SRT_MUT_UM from REP_QMUT" /> 
    <property name="rowMapper"> 
     <bean class="com.aegon.quinto.service.mapper.MutationInputRowMapper" /> 
    </property> 
</bean> 
<bean id="simpleStep" 
    class="org.springframework.batch.core.step.item.SimpleStepFactoryBean"> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="jobRepository" ref="jobRepository" /> 
    <property name="itemReader" ref="itemReader" /> 
    <property name="itemWriter" ref="itemWriter" /> 
    <property name="commitInterval" value="10" /> 
    <property name="startLimit" value="1" /> 
</bean> 

<bean id="itemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="itemSqlParameterSourceProvider"> 
     <bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" /> 
    </property> 
    <property name="sql" value="INSERT INTO MUT_TRIAL(DLNRNR, AFVDAT, MEMO_MUTATION, MEMO_PARTICIPANT, MUTATION_DATE, PROCESSING_DATE, RUN_NR, SRT_MUT, REP_QMUT_CORTICON_KEY) VALUES (:dlnrnr,:afvDat,:memo,:participantMemo,:mutationDate,:processDate,:runNr,:mutationType,:mutationKey)" /> 
    </bean> 

<bean id="simpleChunkListner" class="com.aegon.quinto.service.listener.SimpleChunkListener" /> 

<bean id="taskExecutor" class="org.springframework.core.task.SyncTaskExecutor" /> 
<bean id="itemProcessor" class="com.aegon.quinto.service.processor.SimpleItemProcessor" /> 

<!-- job id="simpleJob" xmlns="http://www.springframework.org/schema/batch"> 
    <step id="simpleStep"> 
     <tasklet> 
      <chunk reader="itemReader" writer="itemWriter" 
       commit-interval="50"> 
      </chunk> 
     </tasklet> 
    </step> 

</job--> 

<job id="simpleJob" xmlns="http://www.springframework.org/schema/batch"> 
    <step id="simpleStep"> 
     <tasklet task-executor="taskExecutor" throttle-limit="25"> 
      <chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" 
       commit-interval="50"> 
      </chunk> 
     </tasklet> 
    </step> 

</job> 


<!-- For running the BatchLauncher --> 
<bean id="batchLauncher" class="com.aegon.quinto.service.BatchLauncher"> 
    <property name="jobLauncher" ref="jobLauncher" /> 
    <property name="jobRepository" ref="jobRepository" /> 
    <property name="job" ref="simpleJob" /> 
</bean> 
</beans> 

我想在執行多線程步驟

映射:

import java.sql.ResultSet; 

進口值java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import com.aegon.quinto.model.MutationInput;

公共類MutationInputRowMapper實現的RowMapper {

public Object mapRow(ResultSet rs, int rowNum) throws SQLException { 
    // TODO Auto-generated method stub 
    MutationInput mutationInput = new MutationInput(); 
    mutationInput.setMutationKey(rs.getInt("REP_QMUT_KEY")); 
    mutationInput.setDlnrnr(rs.getString("DLN_DLNRNR")); 
    mutationInput.setMemo(rs.getString("F_IND_MEMO_MVM")); 
    mutationInput.setParticipantMemo(rs.getString("F_IND_MEMO_DVB")); 
    mutationInput.setProcessDate(rs.getInt("MUT_VERWDAT_UM")); 
    mutationInput.setRunNr(new Integer("2")); 
    mutationInput.setMutationType(rs.getString("MUT_SRT_MUT_UM")); 

    return mutationInput; 
} 

}

我的總體要求是如下: 我會從輸入表中讀出的數據,與外部服務驗證數據,並更新所述驗證在輸出表中響應。在輸入表中,數據將是扁平結構。即對於學生來說,可以有多個考試的考試成績。在進入外部服務之前,我需要檢索該參與者的所有考試結果。 由於網絡延遲,與外部服務通信將成爲瓶頸。因此,需要多線程。 如果有任何示例實現/任何指南,請告訴我方式。 P.S:我是SpringBatch的新手。

+0

也添加你的taskExecutor的配置。 –

+0

TaskExecutor的配置位於代碼的第一行 – Rajkumar

+0

@Rajkumar當您說使用SimpleAsyncTaskExecutor時只寫入了900條記錄,Job status是否已完成? – gsndev

回答

1

它看起來像你的一個或多個組件不是線程安全的

+0

我正在使用'JdbcCursorItemReader'和'JdbcBatchItemWriter'來讀寫。我應該使用其他讀者嗎? – Rajkumar

+0

有更多的組件,itemProcessor和閱讀器,處理器和作者之間使用的數據對象,請發佈他們所有:-) –

+0

謝謝邁克爾。添加了上面的整個XML。 – Rajkumar

相關問題