我有 2 份不同的工作(实际上更多,但为简单起见假设 2 份)。每个作业都可以与另一个作业并行运行,但同一作业的每个实例都应按顺序运行(否则实例将蚕食彼此的资源)。
基本上我希望这些作业中的每一个都有自己的作业实例队列。我想我可以使用两个不同的线程池作业启动器(每个都有 1 个线程)并将作业启动器与每个作业相关联来做到这一点。
从 Spring Batch Admin Web UI 启动作业时,是否有办法做到这一点?
我有 2 份不同的工作(实际上更多,但为简单起见假设 2 份)。每个作业都可以与另一个作业并行运行,但同一作业的每个实例都应按顺序运行(否则实例将蚕食彼此的资源)。
基本上我希望这些作业中的每一个都有自己的作业实例队列。我想我可以使用两个不同的线程池作业启动器(每个都有 1 个线程)并将作业启动器与每个作业相关联来做到这一点。
从 Spring Batch Admin Web UI 启动作业时,是否有办法做到这一点?
有一种方法可以为特定作业指定特定的作业启动器,但我发现这样做的唯一方法是使用 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>
@ahbutfore
工作是如何触发的?您是否有机会使用石英触发器?如果是的话,在你所有的工作中实现/扩展 org.quartz.StatefulJob 接口会为你工作吗?
请参阅此处的 Spring beans 配置: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
使用 shell 脚本,您可以并行启动不同的作业。
在每个命令行的末尾添加一个“&”。shell 将与它自己的执行并行执行它们。