2010-02-24 8 views
12

Ho impostato correttamente un progetto di Spring Batch. Mi piacerebbe davvero sapere se è possibile renderlo multi-threaded al "livello di primavera".Come impostare il multi-threading in Spring Batch?

L'idea di base di ciò che voglio è creare un elenco di attività o di attività e lasciarli catturare e lavorare su thread indipendenti, idealmente da un pool limitato a un numero di thread.

È possibile? Se é cosi, come? Qualcuno potrebbe mostrarmi come guidarmi a quel punto da dove sono attualmente?

Il semplice progetto che ho è da questo tutorial here. Fondamentalmente ha diversi compiti che stampano un messaggio sullo schermo.

Ecco il mio file simpleJob.xml corrente, che contiene i dettagli del lavoro:

<import resource="applicationContext.xml"/> 

    <bean id="hello" class="helloworld.PrintTasklet"> 
     <property name="message" value="Hello"/> 
    </bean> 

    <bean id="space" class="helloworld.PrintTasklet"> 
     <property name="message" value=" "/> 
    </bean> 

    <bean id="world" class="helloworld.PrintTasklet"> 
     <property name="message" value="World!\n"/> 
    </bean> 

    <bean id="taskletStep" class="org.springframework.batch.core.step.tasklet.TaskletStep" > 
     <property name="jobRepository" ref="jobRepository"/> 
     <property name="transactionManager" ref="transactionManager"/> 
    </bean> 

    <bean id="simpleJob" class="org.springframework.batch.core.job.SimpleJob"> 
     <property name="name" value="simpleJob" /> 
     <property name="steps"> 
      <list> 
       <bean parent="taskletStep"> 
        <property name="tasklet" ref="hello"/> 
       </bean> 
       <bean parent="taskletStep"> 
        <property name="tasklet" ref="space"/> 
       </bean> 
       <bean parent="taskletStep"> 
        <property name="tasklet" ref="world"/> 
       </bean> 
      </list> 
     </property> 
     <property name="jobRepository" ref="jobRepository"/> 
    </bean> 

mio appContext contiene il fagiolo repository lavoro (SimpleJobRepository), gestore delle transazioni (ResourceLessTransactionManager) e lanciatore di lavoro (SimpleJobLauncher). Posso anche fornire questo codice se lo desideri, ma non volevo impantanare questo post con tonnellate di XML.

Grazie mille per qualsiasi aiuto!

risposta

10

Creare una divisione e sarà possibile utilizzare il multithreading tra i diversi rami. Utilizzare un TaskExecutor per definire il criterio di parallelismo.

Vedi Multi-threaded Step

assicurarsi di utilizzare l'ultima versione di batch primavera, se si desidera utilizzare il multithreading e il MapJobRepository (prima della versione più recente, questo JobRepository non è stato thread-safe).

4

Dai un'occhiata a Jean risponde '. Un modo semplice è creare un bean di SimpleAsyncTaskExecutor e associare un tasklet per utilizzare questo bean, in questo modo.

<bean id="simpleTaskExecutor" 
    class="org.springframework.core.task.SimpleAsyncTaskExecutor"> 
    <property name="concurrencyLimit" value="10"/> 
</bean> 

<batch:job id="jobTest"> 
    <batch:step id="step1"> 
    <!-- throttle-limit default is 4. Increase this to ensure that a thread pool is fully utilized --> 
     <batch:tasklet task-executor="simpleTaskExecutor" throttle-limit="20"> 
      <batch:chunk /> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 
Problemi correlati