跳到主要内容

配置 JobLauncher

QWen Plus 中英对照 Configuring a JobLauncher

当你使用 @EnableBatchProcessing 时,会为你提供一个 JobRegistry。本节描述了如何配置你自己的 JobRegistry

JobLauncher 接口最基本的实现是 TaskExecutorJobLauncher。它唯一必需的依赖是一个 JobRepository(用于获取执行实例)。

下面的示例展示了 Java 中的 TaskExecutorJobLauncher

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

一旦获得 JobExecution ,它将被传递给 Job 的 execute 方法,最终将 JobExecution 返回给调用者,如下图所示:

Job Launcher Sequence

图1. 作业启动序列

该序列 straightforward 且从调度器启动时运行良好。然而,当尝试从 HTTP 请求启动时会出现问题。在这种情况下,启动需要异步进行,以便 TaskExecutorJobLauncher 可以立即返回给调用者。这是因为让 HTTP 请求保持打开状态以等待长时间运行的进程(例如批处理作业)完成并不是一个好的实践。下图展示了一个示例序列:

异步作业启动器序列

图 2. 异步作业启动器序列

你可以通过配置一个 TaskExecutor 来设置 TaskExecutorJobLauncher,以允许这种场景。

下面的 Java 示例配置了一个 TaskExecutorJobLauncher,使其立即返回:

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

你可以使用 spring TaskExecutor 接口的任何实现来控制作业的异步执行方式。