配置 JobLauncher
- Java
- XML
当你使用 @EnableBatchProcessing
时,会为你提供一个 JobRegistry
。本节描述了如何配置你自己的 JobRegistry
。
JobLauncher
接口最基本的实现是 TaskExecutorJobLauncher
。它唯一必需的依赖是一个 JobRepository
(用于获取执行实例)。
- Java
- XML
下面的示例展示了 Java 中的 TaskExecutorJobLauncher
:
...
@Bean
public JobLauncher jobLauncher() throws Exception {
TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.afterPropertiesSet();
return jobLauncher;
}
...
下面的示例展示了 XML 中的 TaskExecutorJobLauncher
:
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.TaskExecutorJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
一旦获得 JobExecution ,它将被传递给 Job
的 execute 方法,最终将 JobExecution
返回给调用者,如下图所示:
图1. 作业启动序列
该序列 straightforward 且从调度器启动时运行良好。然而,当尝试从 HTTP 请求启动时会出现问题。在这种情况下,启动需要异步进行,以便 TaskExecutorJobLauncher
可以立即返回给调用者。这是因为让 HTTP 请求保持打开状态以等待长时间运行的进程(例如批处理作业)完成并不是一个好的实践。下图展示了一个示例序列:
图 2. 异步作业启动器序列
你可以通过配置一个 TaskExecutor
来设置 TaskExecutorJobLauncher
,以允许这种场景。
- Java
- XML
下面的 Java 示例配置了一个 TaskExecutorJobLauncher
,使其立即返回:
@Bean
public JobLauncher jobLauncher() {
TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
jobLauncher.setJobRepository(jobRepository());
jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
jobLauncher.afterPropertiesSet();
return jobLauncher;
}
下面的 XML 示例配置了一个 TaskExecutorJobLauncher
,使其立即返回:
<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
接口的任何实现来控制作业的异步执行方式。