我怎么能保证只有一个JobInstance同时运行?

时间:2012-03-20 13:13:36

标签: spring-batch

Spring Batch文档说:“ Spring Batch将不会阻止它们同时运行”(http://static.springsource.org/spring-batch/reference/html-single /index.html)。

但是如果我尝试运行一个作业并且有一个该作业的实例正在运行,我想得到一个错误。有可能吗?

我正在使用Spring Batch 2.1.8。

2 个答案:

答案 0 :(得分:5)

如果您知道后续作业将排队,则可以使用TaskExecutor。

  1. 实例化具有最大池大小的任务执行程序,例如500

    <task:executor id="poolTaskExecutor" pool-size="500"/>
    
  2. ThrottledTaskexecutor

    ThrottledTaskExecutor一次只会将给定数量的任务传递给 poolTask​​Executor 。 这个类可以在下面的spring github中找到,或者你可以下载maven artifact。 https://github.com/SpringSource/spring-batch-admin/blob/master/spring-batch-admin-manager/src/main/java/org/springframework/batch/admin/util/ThrottledTaskExecutor.java

  3. 实例化ThrottledTaskExecutor

    <bean id="throttledTaskExecutor" 
          class="org.springframework.batch.admin.util.ThrottledTaskExecutor">
      <property name="taskExecutor" ref="poolTaskExecutor" />
      <property name="throttleLimit" value="1"/>
    </bean>
    
  4. ThrottledJobLauncher

    <bean id="throttledJobLauncher"
            class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor" ref="throttledTaskExecutor" />
    </bean>
    
  5. 使用上面的 throttledJobLauncher 启动的所有作业一次只能运行一个实例。这更灵活,您可以使用给定的throttledLimit限制一个或多个作业。

    实际上,poolTask​​Executor定义和ThrottledTaskexecutor类来自spring-batch-admin。这些都是开箱即用的功能。您只需要定义具有限制的ThrottledTaskExecutor并将其包含在作业的jobLauncher中。

答案 1 :(得分:2)

你可以检查

jobExecution.getStatus()

中所述

https://stackoverflow.com/a/8711857/1627688