配置 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 啟動器序列

該序列流程直接,當從排程器啟動時工作良好。然而,當嘗試從 HTTP 請求啟動時會出現問題。在這種場景下,啟動需要非同步進行,以便 TaskExecutorJobLauncher 立即返回給其呼叫者。這是因為長時間執行的程序(如批處理作業)會佔用 HTTP 請求很長時間,保持 HTTP 請求長時間開啟不是一個好的實踐。下圖顯示了一個示例序列

Async Job Launcher Sequence
圖 2. 非同步 Job 啟動器序列

您可以透過配置 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 介面的任何實現來控制作業如何非同步執行。