2012-07-19 141 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