配置 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 请求保持打开状态的时间过长(例如长时间运行的流程,如批处理作业)是不好的做法。下图显示了一个示例序列

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 接口的任何实现来控制作业的异步执行方式。