配置 JobOperator

JobOperator 接口最基本的实现是 TaskExecutorJobOperator。 它仅需要一个依赖项:JobRepository。其他所有依赖项(如 JobRegistryMeterRegistryTransactionManager 等)均为可选。Spring Batch 提供了一个工厂 Bean 以简化该操作器的配置:JobOperatorFactoryBean。此工厂 Bean 会在 TaskExecutorJobOperator 周围创建一个事务代理,以确保其所有公共方法 均在事务中执行。spring-doc.cadn.net.cn

以下示例展示了如何在Java中配置一个TaskExecutorJobOperatorspring-doc.cadn.net.cn

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

以下示例展示了如何在 XML 中配置一个 TaskExecutorJobOperatorspring-doc.cadn.net.cn

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

一旦获取到 JobExecution,它将被传递给 Job 的 execute 方法,最终将 JobExecution 返回给调用者,如下图所示:spring-doc.cadn.net.cn

Job Launcher Sequence
图 1. 作业Starters序列

该流程简单明了,在从调度器启动时运行良好。然而,当尝试从 HTTP 请求启动时会出现问题。在这种情况下,启动操作需要异步执行,以便 TaskExecutorJobOperator 能够立即返回给调用者。这是因为让 HTTP 请求长时间保持打开状态(以等待批处理作业等耗时较长的进程完成)并非良好的实践。下图展示了一个示例流程:spring-doc.cadn.net.cn

Async Job Launcher Sequence
图 2.异步作业Starters序列

您可以通过配置一个TaskExecutor来配置TaskExecutorJobOperator,以支持此场景。spring-doc.cadn.net.cn

以下 Java 示例配置了一个 TaskExecutorJobOperator 以立即返回:spring-doc.cadn.net.cn

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

以下 XML 示例配置 TaskExecutorJobOperator 以立即返回:spring-doc.cadn.net.cn

XML 配置
<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 接口的任何实现来控制作业如何异步执行。spring-doc.cadn.net.cn