Как настроить многопоточность в Spring Batch? - PullRequest
13 голосов
/ 24 февраля 2010

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

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

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

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

Вот мой текущий файл 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>

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

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

Ответы [ 2 ]

11 голосов
/ 19 июля 2010

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

См. Многопоточный шаг

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

4 голосов
/ 06 января 2015

Посмотрите на ответы Джин '. Самый простой способ - создать компонент 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...