2010-02-24 3 views
12

Я успешно создал учебный проект Spring Batch. Мне бы очень хотелось узнать, возможно ли сделать его многопоточным на уровне «Весна».Как настроить многопоточность в Spring Batch?

Основная идея того, что я хочу, состоит в том, чтобы составить список задач или шагов задачи и позволить им подхватываться и обрабатываться независимыми потоками, в идеале из пула, ограниченного числом «n» потоков.

Возможно ли это? Если да, то как? Может ли кто-нибудь показать мне, что я сейчас нахожусь?

Простой проект, который у меня есть, из этого урока here. В основном это разные задачи, которые выводят сообщение на экран.

Вот мой текущий файл simpleJob.xml, который содержит сведение о задании:

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

Мой контекст приложение содержит хранилище работы боба (SimpleJobRepository), менеджер транзакций (ResourceLessTransactionManager) и работу пусковой (SimpleJobLauncher). Я также могу предоставить этот код, если захочу, но я просто не хотел увязывать этот пост с тоннами XML.

Большое спасибо за помощь!

ответ

10

Создайте Split, и вы сможете использовать многопоточность между различными ветвями. Используйте TaskExecutor для определения вашей политики параллелизма.

См Multi-threaded Step

Обязательно используйте последнюю версию Spring Batch, если вы хотите использовать многопоточность и MapJobRepository (до последней версии, это JobRepository не поточно).

4

Взгляните на ответы Джин. Простым способом является создание компонента SimpleAsyncTaskExecutor и привязка тасклета к использованию этого компонента.

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