2012-07-19 576 views
1

我定义了一个Spring参数restart =“false”的Spring-Batch作业,因为我不希望再次启动同一个作业实例。重新启动不可重新启动的作业的新实例

<batch:job id="myJob" restartable="false"> 
    <batch:step id="myStep"> 
     <batch:tasklet> 
      ... 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

工作是在其他两个高级别作业引用:

<batch:job id="hightLevelJob1" restartable="false"> 
    <batch:step id="myHighLevelJob1Step1" next="..."> 
     <batch:job ref="myJob"/> 
    </batch:step> 
    ... 
</batch:job> 

<batch:job id="hightLevelJob2" restartable="false"> 
    <batch:step id="myHighLevelJob2Step1" next="..."> 
     <batch:job ref="myJob"/> 
    </batch:step> 
    ... 
</batch:job> 

我现在有两个的JUnit测试,每个启动高层次的工作之一:

@Autowired 
private JobOperator jobOperator; 

@Test 
public void testHighLevelJob1() throws JobExecutionException { 
    final Long executionId = jobOperator.startNextInstance("myHighLevelJob1"); 
    ... 
} 

@Test 
public void testHighLevelJob2() throws JobExecutionException { 
    final Long executionId = jobOperator.startNextInstance("myHighLevelJob2"); 
    ... 
} 

的第一个测试运行良好,而第二个测试运行良好,而第二个测试则抛出JobRestartException:

JobInstance already exists and is not restartable 

我正在使用jobOperator.startNextInstance(),因此它创建了一个新的作业。但是,这似乎只适用于开始的高级别工作。它看起来像Spring-Batch试图重新使用引用的作业。

如何将作业配置为每次都创建引用作业的新实例?

回答

1

需要在此一JobParametersIncrementer工作,为startNextInstance的javadoc明确指出:“启动由连接到指定的作业的JobParametersIncrementer确定JobInstance序列中的下一个”

的JobParametersIncrementer可以帮助你增加并将一个新参数添加到JobParameters中,通过这种方式可以启动Job的新实例。

修改你的工作bean定义,并添加一个增量

<batch:job id="myJob" restartable="false" incrementer="incrementer"> 
    <batch:step id="myStep"> 
     <batch:tasklet> 
      ... 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

并与一个简单的加法实现JobParametersIncrementer类

<bean id="incrementer" 
     class="com...TrivialJobParametersIncrementer" /> 

您可能会发现Spring Batch的管理样本的样本TrivialJobParametersIncrementer

+0

我试过了,但异常保持不变。我已经在使用类__org.springframework.batch.core.launch.support.RunIdIncrementor__。在使用调试器进行检查时,增量器仅针对较高级别的作业执行,但以某种方式从不执行所引用的作业。 – Jack 2012-07-20 11:38:45