2010-02-24 126 views
12

He configurado con éxito un proyecto tutorial Spring Batch. Realmente me gustaría saber si es posible hacer múltiples subprocesos en el "nivel de primavera".¿Cómo configurar multihilos en Spring Batch?

La idea básica de lo que quiero es hacer una lista de tareas o pasos de tareas y dejar que sean recogidos y trabajados por subprocesos independientes, idealmente de un grupo limitado a 'n' número de subprocesos.

¿Esto es posible? ¿Si es así, cómo? ¿Podría alguien mostrar guiarme a ese punto desde donde estoy actualmente?

El proyecto simple que tengo es de este tutorial here. Básicamente tiene diferentes tareas que imprimen un mensaje en la pantalla.

Aquí está mi archivo simpleJob.xml actual, que contiene los detalles de la oferta:

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

Mi appContext contiene el grano de depósito de trabajos (SimpleJobRepository), administrador de transacciones (ResourceLessTransactionManager) y el lanzador de trabajo (SimpleJobLauncher). Puedo proporcionar este código si así lo desea, simplemente no quería empantanar esta publicación con toneladas de XML.

Muchas gracias por cualquier ayuda!

Respuesta

10

Cree una división y podrá usar subprocesamiento múltiple entre las diferentes ramas. Use TaskExecutor para definir su política de paralelismo.

Ver Multi-threaded Step

Asegúrese de utilizar la última versión de Spring Batch si desea utilizar el multithreading y de la MapJobRepository (antes de la última versión, esta JobRepository no estaba hilo de seguridad).

4

Eche un vistazo a las respuestas de Jean '. Una forma fácil es crear un bean de SimpleAsyncTaskExecutor y asociar un tasklet para usar este bean, así.

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