設定 JobLauncher

  • Java

  • XML

當您使用 @EnableBatchProcessing 時,會為您提供 JobRegistry。本節說明如何設定您自己的 JobRegistry

`JobLauncher` 介面最基本的實作是 TaskExecutorJobLauncher。它唯一需要的依賴項是 JobRepository (用於取得執行個體)。

  • Java

  • XML

以下範例顯示 Java 中的 TaskExecutorJobLauncher

Java 設定
...
@Bean
public JobLauncher jobLauncher() throws Exception {
	TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
	jobLauncher.setJobRepository(jobRepository);
	jobLauncher.afterPropertiesSet();
	return jobLauncher;
}
...

以下範例顯示 XML 中的 TaskExecutorJobLauncher

XML 設定
<bean id="jobLauncher"
      class="org.springframework.batch.core.launch.support.TaskExecutorJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

一旦取得 JobExecution,它會被傳遞到 Job 的 execute 方法,最終將 JobExecution 返回給呼叫者,如下圖所示

Job Launcher Sequence
圖 1. Job Launcher 順序

此順序很簡單,且在從排程器啟動時運作良好。但是,嘗試從 HTTP 請求啟動時會出現問題。在這種情況下,啟動需要非同步完成,以便 TaskExecutorJobLauncher 立即返回給呼叫者。這是因為將 HTTP 請求保持開啟狀態以等待長時間運行的程序 (例如批次 Job) 所需的時間並不是好的做法。下圖顯示了一個範例順序

Async Job Launcher Sequence
圖 2. 非同步 Job Launcher 順序

您可以透過設定 TaskExecutor 來設定 TaskExecutorJobLauncher 以允許這種情況。

  • Java

  • XML

以下 Java 範例設定 TaskExecutorJobLauncher 以立即返回

Java 設定
@Bean
public JobLauncher jobLauncher() {
	TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
	jobLauncher.setJobRepository(jobRepository());
	jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
	jobLauncher.afterPropertiesSet();
	return jobLauncher;
}

以下 XML 範例設定 TaskExecutorJobLauncher 以立即返回

XML 設定
<bean id="jobLauncher"
      class="org.springframework.batch.core.launch.support.TaskExecutorJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
    <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
    </property>
</bean>

您可以使用 Spring TaskExecutor 介面的任何實作來控制 Job 的非同步執行方式。