跳到主要内容
版本:6.0.2

配置 JobOperator

DeepSeek V3 中英对照 Configuring a JobOperator

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

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

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

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

Job Launcher 序列

图 1. 作业启动器序列

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

异步作业启动器序列

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

你可以通过配置 TaskExecutor 来配置 TaskExecutorJobOperator 以支持此场景。

以下 Java 示例配置了一个 TaskExecutorJobOperator 以立即返回:

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

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