我已经成功建立了一个教程Spring Batch项目。我真的很想知道是否可以在“Spring级别”使其成为多线程。
我想要的基本思路是制作一个任务列表或任务步骤,让它们被独立的线程拾取和处理,最好是在一个限制为'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>
我的appContext包含作业存储库bean(SimpleJobRepository
),事务管理器(ResourceLessTransactionManager
)和作业启动器(SimpleJobLauncher
)。如果需要,我也可以提供这段代码,我只是不想用大量的XML来破坏这篇文章。
非常感谢您的帮助!
答案 0 :(得分:11)
创建一个Split,您将能够在不同分支之间使用多线程。 使用TaskExecutor定义并行策略。
如果要使用多线程和MapJobRepository(在最新版本之前,此JobRepository不是线程安全的),请确保使用最新版本的Spring Batch。
答案 1 :(得分:4)
看看Jean的回答&#39;。一种简单的方法是创建一个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>