Подтвердить что ты не робот

Как настроить многопоточность в Spring Пакет?

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

Основная идея того, что я хочу, состоит в том, чтобы составить список задач или шагов задачи и позволить им быть подобраны и обработаны независимыми потоками, в идеале, из пула, ограниченного числом "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>

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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