Spring Batch:针对不同工作的不同工作启动器

时间:2012-11-20 17:58:40

标签: java spring spring-batch spring-batch-admin

我有2个不同的工作(实际上更多,但为简单起见假设2)。每个作业可以与另一个作​​业并行运行,但同一作业的每个实例都应该按顺序运行(否则实例会蚕食彼此的资源)。

基本上我希望每个这些作业都拥有自己的作业实例队列。我想我可以使用两个不同的线程池作业启动器(每个都有1个线程)并将作业启动器与每个作业相关联。

从Spring Batch Admin Web UI启动作业时,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

有一种方法可以为特定作业指定特定的作业启动器,但我找到的唯一方法是使用JobStep。

如果您有一个名为“specificJob”的作业,这将创建另一个作业“queueSpecificJob”,因此当您通过Quartz或Spring Batch Web管理员启动它时,它将排队“specificJob”执行。

<bean id="specificJobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository"/>
    <property name="taskExecutor">
        <task:executor id="singleThreadPoolExecutor" pool-size="1"/>
    </property>
</bean>

<job id="queueSpecificJob">
    <step id="specificJobStep">
        <job ref="specificJob" job-launcher="specificJobLauncher" job-parameters-extractor="parametersExtractor" />
    </step>
</job>

答案 1 :(得分:1)

@ ahbutfore

工作是如何触发的?你有机会使用石英触发器吗? 如果是的话,在所有工作中实施/扩展org.quartz.StatefulJob接口会为你做什么工作吗?

请参阅此处的Spring bean配置:https://github.com/regunathb/Trooper/blob/master/examples/example-batch/src/main/resources/external/shellTaskletsJob/spring-batch-config.xml。检查org.trpr.platform.batch.impl.spring.job.BatchJob的源代码

您可以使用合适的“Leader Election”实现执行更复杂的序列化(包括跨Spring批处理节点)。我在我的项目中使用过Netflix Curator(Apache Zookeeper配方)。这里有一些指示:https://github.com/regunathb/Trooper/wiki/Useful-Batch-Libraries

答案 2 :(得分:0)

使用shell脚本可以并行启动不同的作业。

添加'&amp;'到每个命令行的末尾。 shell将与它自己的执行并行执行它们。