如何在Spring Batch中设置多线程?

Cug*_*uga 13 java spring multithreading spring-batch

我已经成功建立了一个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>
Run Code Online (Sandbox Code Playgroud)

我的appContext包含作业存储库bean(SimpleJobRepository),事务管理器(ResourceLessTransactionManager)和作业启动器(SimpleJobLauncher).如果需要,我也可以提供这个代码,我只是不想用大量的XML来破坏这篇文章.

非常感谢您的帮助!

Jea*_*end 12

创建一个Split,你就可以在不同的分支之间使用多线程.使用TaskExecutor定义并行策略.

请参阅多线程步骤

如果要使用多线程和MapJobRepository(在最新版本之前,此JobRepository不是线程安全的),请务必使用最新版本的Spring Batch.


Hen*_*oJR 6

看看Jean的回答。一个简单的方法是创建一个 SimpleAsyncTaskExecutor 的 bean 并关联一个 tasklet 来使用这个 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>
Run Code Online (Sandbox Code Playgroud)