配置 Job

Job 介面有多種實現。然而,這些實現被抽象在所提供的構建器(用於 Java 配置)或 XML 名稱空間(用於基於 XML 的配置)之後。以下示例展示了 Java 和 XML 配置

  • Java

  • XML

@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
                     .start(playerLoad())
                     .next(gameLoad())
                     .next(playerSummarization())
                     .build();
}

一個 Job(通常,其中包含的任何 Step)需要一個 JobRepository

前面的例子展示了一個由三個 Step 例項組成的 Job。與作業相關的構建器還可以包含其他元素,這些元素有助於並行化(Split)、宣告式流控制(Decision)和流定義的外部化(Flow)。

Job 介面有多種實現。然而,名稱空間抽象了配置中的差異。它只有三個必需的依賴項:名稱、JobRepositoryStep 例項列表。以下示例建立了一個 footballJob

<job id="footballJob">
    <step id="playerload"          parent="s1" next="gameLoad"/>
    <step id="gameLoad"            parent="s2" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
</job>

前面的示例使用父 bean 定義來建立步驟。有關宣告特定步驟詳情的更多選項,請參閱步驟配置部分。XML 名稱空間預設引用一個 idjobRepository 的倉庫,這是一個合理的預設值。但是,您可以明確覆蓋此預設值

<job id="footballJob" job-repository="specialRepository">
    <step id="playerload"          parent="s1" next="gameLoad"/>
    <step id="gameLoad"            parent="s3" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
</job>

除了步驟,作業配置還可以包含其他元素,這些元素有助於並行化 (<split>)、宣告式流程控制 (<decision>) 和流程定義的外部化 (<flow/>)。

可重啟性

執行批處理作業時的一個關鍵問題是 Job 在重新啟動時的行為。如果特定 JobInstanceJobExecution 已經存在,則啟動 Job 被視為“重新啟動”。理想情況下,所有作業都應該能夠從它們停止的地方開始,但在某些情況下這是不可能的。在這種情況下,完全由開發人員確保建立一個新的 JobInstance然而,Spring Batch 提供了一些幫助。如果 Job 永遠不應該重新啟動,而應該始終作為新 JobInstance 的一部分執行,您可以將 restartable 屬性設定為 false

  • Java

  • XML

以下示例展示瞭如何在 Java 中將 restartable 欄位設定為 false

Java 配置
@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
                     .preventRestart()
                     ...
                     .build();
}

以下示例展示瞭如何在 XML 中將 restartable 欄位設定為 false

XML 配置
<job id="footballJob" restartable="false">
    ...
</job>

換句話說,將 restartable 設定為 false 意味著“此 Job 不支援再次啟動”。重新啟動不可重啟的 Job 會丟擲 JobRestartException。以下 Junit 程式碼會導致此異常被丟擲

Job job = new SimpleJob();
job.setRestartable(false);

JobParameters jobParameters = new JobParameters();

JobExecution firstExecution = jobRepository.createJobExecution(job, jobParameters);
jobRepository.saveOrUpdate(firstExecution);

try {
    jobRepository.createJobExecution(job, jobParameters);
    fail();
}
catch (JobRestartException e) {
    // expected
}

第一次為不可重啟的作業建立 JobExecution 沒有問題。但是,第二次嘗試會丟擲 JobRestartException

攔截作業執行

Job 執行過程中,能夠收到其生命週期中各種事件的通知,以便執行自定義程式碼可能很有用。SimpleJob 透過在適當的時間呼叫 JobListener 來實現這一點

public interface JobExecutionListener {

    void beforeJob(JobExecution jobExecution);

    void afterJob(JobExecution jobExecution);
}

您可以透過在作業上設定監聽器來向 SimpleJob 新增 JobListeners

  • Java

  • XML

以下示例展示瞭如何向 Java 作業定義新增監聽器方法

Java 配置
@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
                     .listener(sampleListener())
                     ...
                     .build();
}

以下示例展示瞭如何向 XML 作業定義新增監聽器元素

XML 配置
<job id="footballJob">
    <step id="playerload"          parent="s1" next="gameLoad"/>
    <step id="gameLoad"            parent="s2" next="playerSummarization"/>
    <step id="playerSummarization" parent="s3"/>
    <listeners>
        <listener ref="sampleListener"/>
    </listeners>
</job>

請注意,無論 Job 成功或失敗,都會呼叫 afterJob 方法。如果您需要確定成功或失敗,可以從 JobExecution 中獲取該資訊

public void afterJob(JobExecution jobExecution){
    if (jobExecution.getStatus() == BatchStatus.COMPLETED ) {
        //job success
    }
    else if (jobExecution.getStatus() == BatchStatus.FAILED) {
        //job failure
    }
}

與此介面對應的註解有

  • @BeforeJob

  • @AfterJob

從父作業繼承

如果一組作業共享相似但不完全相同的配置,定義一個“父”Job,具體 Job 例項可以從其中繼承屬性,可能會有所幫助。類似於 Java 中的類繼承,“子”Job 將其元素和屬性與父級的元素和屬性合併。

在以下示例中,baseJob 是一個抽象的 Job 定義,它只定義了一個監聽器列表。Jobjob1)是一個具體的定義,它從 baseJob 繼承了監聽器列表,並將其與自己的監聽器列表合併,以生成一個具有兩個監聽器和一個 Stepstep1)的 Job

<job id="baseJob" abstract="true">
    <listeners>
        <listener ref="listenerOne"/>
    </listeners>
</job>

<job id="job1" parent="baseJob">
    <step id="step1" parent="standaloneStep"/>

    <listeners merge="true">
        <listener ref="listenerTwo"/>
    </listeners>
</job>

有關更多詳細資訊,請參閱從父步驟繼承部分。

JobParametersValidator

在 XML 名稱空間中宣告的或使用 AbstractJob 的任何子類的作業都可以選擇在執行時宣告作業引數的驗證器。當您需要斷言作業以所有必需引數啟動時,這非常有用。有一個 DefaultJobParametersValidator,您可以使用它來限制簡單必需引數和可選引數的組合。對於更復雜的約束,您可以自己實現介面。

  • Java

  • XML

透過 Java 構建器支援驗證器的配置

@Bean
public Job job1(JobRepository jobRepository) {
    return new JobBuilder("job1", jobRepository)
                     .validator(parametersValidator())
                     ...
                     .build();
}

透過 XML 名稱空間,透過 job 的子元素支援驗證器的配置,如以下示例所示

<job id="job1" parent="baseJob3">
    <step id="step1" parent="standaloneStep"/>
    <validator ref="parametersValidator"/>
</job>

您可以將驗證器指定為引用(如前所示)或作為 beans 名稱空間中的巢狀 bean 定義。

© . This site is unofficial and not affiliated with VMware.