設定可重新啟動的 Step
在「設定與執行 Job」章節中,已討論過重新啟動 Job
。重新啟動對於 steps 有許多影響,因此可能需要一些特定的設定。
設定啟動限制
在許多情況下,您可能會想要控制 Step
可以啟動的次數。例如,您可能需要設定特定的 Step
只能執行一次,因為它會使某些資源失效,而這些資源必須手動修復後才能再次執行。這可以在 step 層級設定,因為不同的 steps 可能有不同的需求。只能執行一次的 Step
可以與可以無限次執行的 Step
存在於同一個 Job
中。
-
Java
-
XML
以下程式碼片段顯示 Java 中啟動限制設定的範例
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(itemReader())
.writer(itemWriter())
.startLimit(1)
.build();
}
以下程式碼片段顯示 XML 中啟動限制設定的範例
<step id="step1">
<tasklet start-limit="1">
<chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
</tasklet>
</step>
前述範例中顯示的 step 只能執行一次。嘗試再次執行它會導致擲出 StartLimitExceededException
例外。請注意,啟動限制的預設值為 Integer.MAX_VALUE
。
重新啟動已完成的 Step
在可重新啟動的 job 的情況下,可能有一個或多個 steps 應該始終執行,無論它們第一次是否成功。例如,驗證 step 或在處理前清理資源的 Step
。在重新啟動的 job 的正常處理期間,任何狀態為 COMPLETED
(表示已成功完成)的 step 都會被跳過。將 allow-start-if-complete
設定為 true
會覆寫此行為,使 step 始終執行。
-
Java
-
XML
以下程式碼片段顯示如何在 Java 中定義可重新啟動的 job
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(itemReader())
.writer(itemWriter())
.allowStartIfComplete(true)
.build();
}
以下程式碼片段顯示如何在 XML 中定義可重新啟動的 job
<step id="step1">
<tasklet allow-start-if-complete="true">
<chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>
</tasklet>
</step>
Step
重新啟動設定範例
-
Java
-
XML
以下 Java 範例顯示如何設定 job,使其 steps 可以重新啟動
@Bean
public Job footballJob(JobRepository jobRepository, Step playerLoad, Step gameLoad, Step playerSummarization) {
return new JobBuilder("footballJob", jobRepository)
.start(playerLoad)
.next(gameLoad)
.next(playerSummarization)
.build();
}
@Bean
public Step playerLoad(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("playerLoad", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(playerFileItemReader())
.writer(playerWriter())
.build();
}
@Bean
public Step gameLoad(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("gameLoad", jobRepository)
.allowStartIfComplete(true)
.<String, String>chunk(10, transactionManager)
.reader(gameFileItemReader())
.writer(gameWriter())
.build();
}
@Bean
public Step playerSummarization(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("playerSummarization", jobRepository)
.startLimit(2)
.<String, String>chunk(10, transactionManager)
.reader(playerSummarizationSource())
.writer(summaryWriter())
.build();
}
以下 XML 範例顯示如何設定 job,使其 steps 可以重新啟動
<job id="footballJob" restartable="true">
<step id="playerload" next="gameLoad">
<tasklet>
<chunk reader="playerFileItemReader" writer="playerWriter"
commit-interval="10" />
</tasklet>
</step>
<step id="gameLoad" next="playerSummarization">
<tasklet allow-start-if-complete="true">
<chunk reader="gameFileItemReader" writer="gameWriter"
commit-interval="10"/>
</tasklet>
</step>
<step id="playerSummarization">
<tasklet start-limit="2">
<chunk reader="playerSummarizationSource" writer="summaryWriter"
commit-interval="10"/>
</tasklet>
</step>
</job>
先前的範例設定適用於載入足球比賽資訊並摘要資訊的 job。它包含三個 steps:playerLoad
、gameLoad
和 playerSummarization
。playerLoad
step 從平面檔案載入球員資訊,而 gameLoad
step 對比賽執行相同的操作。最後一個 step playerSummarization
接著根據提供的比賽摘要每位球員的統計數據。假設由 playerLoad
載入的檔案必須僅載入一次,但 gameLoad
可以載入特定目錄中找到的任何比賽,並在成功載入資料庫後將其刪除。因此,playerLoad
step 不包含額外的設定。它可以啟動任意次數,如果已完成則會跳過。然而,gameLoad
step 需要每次都執行,以防自上次執行以來添加了額外的檔案。它已將 allow-start-if-complete
設定為 true
以始終啟動。(假設遊戲載入的資料庫表上具有處理指示器,以確保摘要 step 可以正確找到新遊戲)。摘要 step 是 job 中最重要的 step,設定為啟動限制為 2。這很有用,因為如果 step 持續失敗,則會將新的結束代碼傳回給控制 job 執行的操作員,並且在進行人工干預之前無法再次啟動。
此 job 提供本文檔的範例,與 samples 專案中找到的 footballJob 不同。 |
本節的其餘部分描述了 footballJob
範例的三次執行中發生的情況。
執行 1
-
playerLoad
執行並成功完成,將 400 名球員新增至PLAYERS
表格。 -
gameLoad
執行並處理 11 個檔案的比賽資料,將其內容載入GAMES
表格。 -
playerSummarization
開始處理,並在 5 分鐘後失敗。
執行 2
-
playerLoad
不會執行,因為它已成功完成,且allow-start-if-complete
為false
(預設值)。 -
gameLoad
再次執行並處理另外 2 個檔案,也將其內容載入GAMES
表格(帶有指示它們尚未處理的處理指示器)。 -
playerSummarization
開始處理所有剩餘的比賽資料(使用處理指示器進行篩選),並在 30 分鐘後再次失敗。
執行 3
-
playerLoad
不會執行,因為它已成功完成,且allow-start-if-complete
為false
(預設值)。 -
gameLoad
再次執行並處理另外 2 個檔案,也將其內容載入GAMES
表格(帶有指示它們尚未處理的處理指示器)。 -
playerSummarization
未啟動,且 job 立即被終止,因為這是playerSummarization
的第三次執行,而其限制僅為 2。必須提高限制或將Job
作為新的JobInstance
執行。