2010-02-24 14 views
12

J'ai réussi à mettre en place un projet tutoriel Spring Batch. J'aimerais vraiment savoir s'il est possible de le rendre multithread au niveau "Spring".Comment configurer le multi-threading dans Spring Batch?

L'idée de base de ce que je veux est de faire une liste de tâches ou d'étapes de tâches et de les laisser être prises en charge par des threads indépendants, idéalement hors d'un pool limité à un nombre de threads.

Est-ce possible? Si c'est le cas, comment? Est-ce que quelqu'un pourrait me guider jusqu'à ce point d'où je suis actuellement?

Le projet simple que j'ai provient de ce tutoriel here. Il a essentiellement différentes tâches qui impriment un message à l'écran.

Voici mon fichier en cours de simpleJob.xml, qui contient les détails du travail:

<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> 

Mon appContext contient la fève de référentiel d'emploi (SimpleJobRepository), gestionnaire de transactions (ResourceLessTransactionManager) et lance-emploi (SimpleJobLauncher). Je peux fournir ce code si vous le souhaitez, je ne voulais pas embourber ce poste avec des tonnes de XML.

Merci beaucoup pour votre aide!

Répondre

10

Créez un Split et vous pourrez utiliser le multithreading entre les différentes branches. Utilisez un TaskExecutor pour définir votre stratégie de parallélisme.

Voir Multi-threaded Step

Assurez-vous d'utiliser la dernière version de Spring Batch si vous souhaitez utiliser le multithreading et la MapJobRepository (avant dernière version, ce JobRepository n'a pas été thread-safe).

4

Jetez un coup d'œil aux réponses de Jean. Un moyen facile est de créer un bean de SimpleAsyncTaskExecutor et d'associer une tasklet pour utiliser ce bean, comme ça.

<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>