当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

配置 JobOperator

JobOperator 接口最基础的实现是 TaskExecutorJobOperator。 它只需要一个依赖:JobRepository。其他依赖如 JobRegistryMeterRegistryTransactionManager 等都是可选的。Spring Batch 提供了一个工厂 bean 来简化该操作器的配置:JobOperatorFactoryBean。这个工厂 bean 会在 TaskExecutorJobOperator 外围创建一个事务代理,以确保其所有公共方法都在事务中执行。

  • Java

  • XML

下面的示例展示了如何在 Java 中配置 TaskExecutorJobOperator

Java Configuration
...
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
	JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
	jobOperatorFactoryBean.setJobRepository(jobRepository);
	return jobOperatorFactoryBean;
}
...

下面的示例展示了如何在 XML 中配置 TaskExecutorJobOperator

XML Configuration
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.JobOperatorFactoryBean">
    <property name="jobRepository" ref="jobRepository" />
</bean>

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

Job 启动顺序
图 1. Job 启动顺序

这一流程非常直接,在由调度器触发时工作良好。不过,当你尝试从 HTTP 请求中启动作业时, 问题就会出现。在这种场景下,启动过程需要异步执行,这样 TaskExecutorJobOperator 才能立即返回给调用方。 原因在于,让一个 HTTP 请求长时间保持打开状态以等待长时间运行的进程(例如批处理作业)完成,并不是一种好的实践。 下图展示了一个示例流程:

异步 Job 启动顺序
图 2. 异步 Job 启动顺序

你可以通过为 TaskExecutorJobOperator 配置一个 TaskExecutor,来支持这种场景。

  • Java

  • XML

下面的 Java 示例将 TaskExecutorJobOperator 配置为立即返回:

Java Configuration
@Bean
public JobOperatorFactoryBean jobOperator(JobRepository jobRepository) {
	JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
	jobOperatorFactoryBean.setJobRepository(jobRepository);
	jobOperatorFactoryBean.setTaskExecutor(new SimpleAsyncTaskExecutor());
	return jobOperatorFactoryBean;
}

下面的 XML 示例将 TaskExecutorJobOperator 配置为立即返回:

XML Configuration
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.JobOperatorFactoryBean">
    <property name="jobRepository" ref="jobRepository" />
    <property name="taskExecutor">
        <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
    </property>
</bean>

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