我已经成功地建立了一个SpringBatch教程项目。我真的很想知道是否有可能在“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的泥潭。
非常非常感谢你的帮助!
2条答案
按热度按时间nbewdwxp1#
创建一个Split,您将能够在不同分支之间使用多线程。使用TaskExecutor定义并行策略。
请参阅多线程步骤
如果要使用多线程和MapJobRepository,请确保使用最新版本的Spring Batch(在最新版本之前,此JobRepository不是线程安全的)。
sshcrbum2#
看一下Jean的答案,一个简单的方法是创建一个SimpleAsyncTaskExecutor的bean,并关联一个tasklet来使用这个bean,就像这样。