在 Spring Batch4 中,JobOperator 是一个高级接口,提供了对批处理作业(Job)的集中式管理能力,包括启动、停止、重启、查询作业状态等操作。它简化了作业的生命周期管理,尤其适合需要通过编程方式或外部系统控制作业的场景。
JobOperator 接口常用方法如下:
| 方法 | 功能描述 |
| Long start(String jobName, String parameters) | 启动指定名称的作业,参数以键值对字符串形式传入(如 param1=value1;param2=value2) |
| Long restart(Long executionId) | 重启指定执行 ID 的作业(针对失败或停止的作业) |
| void stop(Long executionId) | 停止正在执行的作业(通过设置执行状态为 STOPPED) |
| List<Long> getExecutions(Long instanceId) | 获取指定作业实例的所有执行记录 ID |
| List<Long> getJobInstances(String jobName, int start, int count) | 分页查询指定作业名称的实例 ID 列表 |
| JobExecution getJobExecution(Long executionId) | 获取指定执行 ID 的作业执行详情 |
| JobInstance getJobInstance(Long instanceId) | 获取指定实例 ID 的作业实例详情 |
| Set<String> getJobNames() | 获取所有已注册的作业名称 |
| String getParametersAsString(Long executionId) | 将指定执行的参数转换为字符串 |
JobOperator 定义如下:
package org.springframework.batch.core.launch;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
/**
* Spring Batch 中低级别接口,用于检查和控制作业,仅通过基本类型和集合类型进行访问。
* 适用于命令行客户端(例如,每个操作启动一个新进程)或远程启动器(如JMX控制台)。
*
* 提供对作业实例(JobInstance)、作业执行(JobExecution)的管理能力,
* 包括启动、重启、停止作业,查询作业状态等操作,是 Spring Batch 中作业调度的关键接口。
*
* @author Dave Syer
* @since 2.0
*/
public interface JobOperator {
/**
* 获取与特定 JobInstance 关联的所有 JobExecution 的 ID,
* 按创建时间倒序排列(通常也是执行时间的倒序)。
*
* @param instanceId 作业实例(JobInstance)的ID
* @return 与该实例关联的所有作业执行(JobExecution)的ID列表
* @throws NoSuchJobInstanceException 如果指定ID的JobInstance不存在时抛出
*/
List<Long> getExecutions(long instanceId) throws NoSuchJobInstanceException;
/**
* 获取指定作业名称的所有 JobInstance 的 ID,按创建时间倒序排列。
* 用于分页查询某个作业的历史实例,例如在监控界面展示作业的执行历史。
*
* @param jobName 作业实例所属的作业名称
* @param start 起始索引(用于分页)
* @param count 最大返回数量(用于分页)
* @return 作业实例(JobInstance)的 ID 列表
* @throws NoSuchJobException 如果指定名称的作业没有任何实例时抛出
*/
List<Long> getJobInstances(String jobName, int start, int count) throws NoSuchJobException;
/**
* 获取指定作业名称的所有运行中 JobExecution 的 ID。
* 用于监控当前正在执行的作业,例如在运维界面展示实时运行的作业列表。
*
* @param jobName 要查询的作业名称
* @return 运行中的 JobExecution 实例的 ID 集合
* @throws NoSuchJobException 如果没有该作业名称的任何 JobExecution 时抛出
*/
Set<Long> getRunningExecutions(String jobName) throws NoSuchJobException;
/**
* 将 JobParameters 转换为易读的字符串格式。
* 作业参数通常包含复杂信息,此方法用于简化参数的展示(如在日志或界面中显示)。
*
* @param executionId 已存在的 JobExecution 的 ID
* @return 用于启动该作业实例的作业参数(字符串格式)
* @throws NoSuchJobExecutionException 如果指定 ID 的 JobExecution 不存在时抛出
*/
String getParameters(long executionId) throws NoSuchJobExecutionException;
/**
* 使用指定的参数启动一个新的作业实例。
* 根据作业名称和参数创建新的 JobInstance 和 JobExecution,并触发作业执行。
*
* @param jobName 要启动的作业({@link Job})名称
* @param parameters 启动参数(以逗号或换行分隔的"name=value"键值对)
* @return 启动的JobExecution的ID
* @throws NoSuchJobException 如果不存在指定名称的 Job 时抛出
* @throws JobInstanceAlreadyExistsException 如果相同名称和参数的 JobInstance 已存在时抛出
* @throws JobParametersInvalidException 如果作业参数无效(如类型不匹配)时抛出
*/
Long start(String jobName, String parameters) throws NoSuchJobException, JobInstanceAlreadyExistsException, JobParametersInvalidException;
/**
* 重启一个失败或已停止的 JobExecution。
* 如果指定的ID不存在,或对应的 JobInstance 已正常完成,则抛出异常。
*
* 注意:仅能重启处于失败(FAILED)或停止(STOPPED)状态的作业执行。
*
* @param executionId 失败或已停止的JobExecution的ID
* @return 重启后新的JobExecution的ID
* @throws JobInstanceAlreadyCompleteException 如果作业实例已成功完成时抛出
* @throws NoSuchJobExecutionException 如果指定ID的JobExecution不存在时抛出
* @throws NoSuchJobException 如果JobExecution对应的Job已不存在时抛出
* @throws JobRestartException 重启过程中出现非特定错误(如重启数据损坏)时抛出
* @throws JobParametersInvalidException 重启时的参数无效时抛出
*/
Long restart(long executionId) throws JobInstanceAlreadyCompleteException, NoSuchJobExecutionException,
NoSuchJobException, JobRestartException, JobParametersInvalidException;
/**
* 启动由作业关联的 JobParametersIncrementer 确定的下一个作业实例序列。
* 如果前一个实例处于失败状态,只要 JobParametersIncrementer 正常工作,
* 此方法仍会创建新实例并使用不同的参数运行。
*
* 适用场景:需要周期性执行的作业(如定时任务),通过递增参数确保每次执行都是新实例。
*
* 注意:以下三种异常(JobRestartException、JobExecutionAlreadyRunningException、
* JobInstanceAlreadyCompleteException)极少出现,通常由并发操作导致。
*
* @param jobName 要启动的作业名称
* @return 启动的JobExecution的ID
* @throws NoSuchJobException 不存在该作业定义时抛出
* @throws JobParametersNotFoundException 无法获取递增参数时抛出
* @throws JobParametersInvalidException 作业参数无效时抛出
* @throws UnexpectedJobExecutionException 出现意外情况时抛出
* @throws JobRestartException 非法重启作业时抛出
* @throws JobExecutionAlreadyRunningException 尝试重启正在执行的作业时抛出
* @throws JobInstanceAlreadyCompleteException 尝试重启已完成的作业时抛出
*/
Long startNextInstance(String jobName) throws NoSuchJobException, JobParametersNotFoundException,
JobRestartException, JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException, UnexpectedJobExecutionException, JobParametersInvalidException;
/**
* 向具有指定 ID 的 JobExecution 发送停止信号。
* 若此方法返回 true,说明信号发送成功,但不保证作业已实际停止。
* 需通过轮询作业执行状态确认是否已停止。
*
* 实现原理:通常通过设置 JobExecution 的状态为 STOPPING,并通知作业线程停止。
*
* @param executionId 运行中的 JobExecution 的 ID
* @return 若信号成功发送则返回true(不保证作业已停止)
* @throws NoSuchJobExecutionException 不存在指定ID的JobExecution时抛出
* @throws JobExecutionNotRunningException 作业执行未处于运行状态时抛出
*/
boolean stop(long executionId) throws NoSuchJobExecutionException, JobExecutionNotRunningException;
/**
* 汇总具有指定 ID 的 JobExecution 的信息,包括状态、开始和结束时间等。
* 作用:快速获取作业执行的关键信息,用于日志输出或界面展示。
*
* @param executionId 已存在的JobExecution的ID
* @return 汇总作业执行状态的字符串
* @throws NoSuchJobExecutionException 不存在指定ID的JobExecution时抛出
*/
String getSummary(long executionId) throws NoSuchJobExecutionException;
/**
* 汇总属于指定 JobExecution 的所有 StepExecution 实例的信息,
* 包括状态、开始和结束时间等。
* 作用:查看作业执行包含的步骤执行详情,用于问题排查或进度监控。
*
* @param executionId 已存在的JobExecution的ID
* @return 步骤执行ID到其状态汇总字符串的映射
* @throws NoSuchJobExecutionException 不存在指定ID的JobExecution时抛出
*/
Map<Long, String> getStepExecutionSummaries(long executionId) throws NoSuchJobExecutionException;
/**
* 列出可通过 start(String, String) 方法启动的所有作业名称。
* 作用:获取系统中已注册的所有作业,用于展示可执行的作业列表。
*
* @return 作业名称的集合
*/
Set<String> getJobNames();
/**
* 将 JobExecution 标记为 ABANDONED(废弃)。
* 如果停止信号因进程崩溃而被忽略,此方法是标记作业完成的最佳方式
* (与 STOPPED 状态区分)。被标记为废弃的作业执行不能被框架重启。
*
* 适用场景:作业进程意外终止后,手动标记其状态为废弃,避免残留未处理的执行记录。
*
* @param jobExecutionId 要终止的作业执行ID
* @return 被终止的JobExecution实例
* @throws NoSuchJobExecutionException 不存在指定ID的作业执行时抛出
* @throws JobExecutionAlreadyRunningException 如果作业正在运行(应先停止)时抛出
*/
JobExecution abandon(long jobExecutionId) throws NoSuchJobExecutionException, JobExecutionAlreadyRunningException;
}
Spring Batch4 为 JobOperator 接口提供了唯一一个实现类 SimpleJobOperator,如下图:

SimpleJobOperator 类是 JobOperator 接口的默认实现类,它提供了一套完整的 API 用于管理和操作批处理任务(Job),包括启动、停止、重启、查询任务状态等核心功能。我们看看它成员变量的定义,如下图:

从上图可知,JobOperator 在 afterPropertiesSet() 方法中对 jobRegistry、jobExplorer、jobLauncher 和 jobRepository 进行了非 null 校验,这是必传项。它们的作用分别如下:
JobLauncher:用于实际启动 Job(支持同步或异步执行)。
JobRepository:用于访问 Job 元数据(如执行状态、参数等),是 SimpleJobOperator 的数据来源。
JobRegistry:用于管理已注册的 Job 定义,通过 Job 名称查找对应的 Job 实例。
JobExplorer:用于查询 Job 执行历史和元数据(通常与 JobRepository 关联)。
我们可以通过四个 set 方法进行设置,如下图:

然后,其他实现 JobOperator 的方法均是通过上述的四个对象进行完成的。
在使用 JobOperator 之前,需要在 Spring 配置类中注册 SimpleJobOperator 并注入依赖组件,如下:
@Configuration
public class BatchConfig implements StepExecutionListener, ApplicationContextAware {
// 用于创建和配置 Job 对象的工厂类
@Autowired
private JobBuilderFactory jobBuilderFactory;
// 用于创建和配置 Step 对象的工厂类
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobLauncher jobLauncher; // Spring 已帮我们创建好
@Autowired
private JobExplorer jobExplorer; // Spring 已帮我们创建好
@Autowired
private JobRepository jobRepository; // Spring 已帮我们创建好
@Autowired
private JobRegistry jobRegistry; // Spring 已帮我们创建好
// JOB参数
private Map<String, JobParameter> jobParameters;
// Spring 应用上下文对象
private ApplicationContext applicationContext;
// 配置 JobOperator
@Bean
public JobOperator jobOperator() {
SimpleJobOperator operator = new SimpleJobOperator();
operator.setJobParametersConverter(new DefaultJobParametersConverter());
operator.setJobRepository(jobRepository);
operator.setJobLauncher(jobLauncher);
operator.setJobExplorer(jobExplorer);
operator.setJobRegistry(jobRegistry);
return operator;
}
// JobRegistryBeanPostProcessor 是一个特殊的 Bean 后置处理器
// 主要作用是自动将 Spring 容器中定义的 Job 实例注册到 JobRegistry 中,实现 Job 定义与注册的自动化关联
@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() throws Exception {
JobRegistryBeanPostProcessor processor = new JobRegistryBeanPostProcessor();
processor.setJobRegistry(jobRegistry);
processor.setBeanFactory(applicationContext.getAutowireCapableBeanFactory());
processor.afterPropertiesSet();
return processor;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
//...省略 Job、ItemReader、ItemProcessor 等...
}
假设我们已经创建了一个名为 jobOperatorDemoJob 的 Job 任务,完整的配置如下:
package com.hxstrive.spring_batch.jobOperatorDemo.config;
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor;
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.JobOperator;
import org.springframework.batch.core.launch.support.SimpleJobOperator;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.item.*;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.*;
/**
* Spring Batch 配置类
* @author hxstrive.com
*/
@Configuration
public class BatchConfig implements StepExecutionListener, ApplicationContextAware {
// 用于创建和配置 Job 对象的工厂类
@Autowired
private JobBuilderFactory jobBuilderFactory;
// 用于创建和配置 Step 对象的工厂类
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobLauncher jobLauncher;
@Autowired
private JobExplorer jobExplorer;
@Autowired
private JobRepository jobRepository;
@Autowired
private JobRegistry jobRegistry;
// JOB参数
private Map<String, JobParameter> jobParameters;
// Spring 应用上下文对象
private ApplicationContext applicationContext;
// 配置 JobOperator
@Bean
public JobOperator jobOperator() {
SimpleJobOperator operator = new SimpleJobOperator();
operator.setJobParametersConverter(new DefaultJobParametersConverter());
operator.setJobRepository(jobRepository);
operator.setJobLauncher(jobLauncher);
operator.setJobExplorer(jobExplorer);
operator.setJobRegistry(jobRegistry);
return operator;
}
// JobRegistryBeanPostProcessor 是一个特殊的 Bean 后置处理器
// 主要作用是自动将 Spring 容器中定义的 Job 实例注册到 JobRegistry 中,实现 Job 定义与注册的自动化关联
@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() throws Exception {
JobRegistryBeanPostProcessor processor = new JobRegistryBeanPostProcessor();
processor.setJobRegistry(jobRegistry);
processor.setBeanFactory(applicationContext.getAutowireCapableBeanFactory());
processor.afterPropertiesSet();
return processor;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void beforeStep(StepExecution stepExecution) {
System.out.println("->> beforeStep(StepExecution stepExecution)");
jobParameters = stepExecution.getJobParameters().getParameters();
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
System.out.println("->> afterStep(StepExecution stepExecution)");
return null;
}
// 创建Job对象
@Bean
public Job jobOperatorDemoJob() {
return jobBuilderFactory.get("jobOperatorDemoJob")
.start(jobOperatorDemoStep())
.listener(new JobExecutionListener() {
@Override
public void beforeJob(JobExecution jobExecution) {
System.out.println("->> JobExecutionListener :: beforeJob() 任务开始...");
}
@Override
public void afterJob(JobExecution jobExecution) {
if(BatchStatus.COMPLETED.equals(jobExecution.getStatus())) {
System.out.println("->> JobExecutionListener :: afterJob() 任务完成 - 成功");
} else {
System.err.println("->> JobExecutionListener :: afterJob() 任务完成 - 执行异常");
}
}
})
.build();
}
// 创建Step对象
@Bean
public Step jobOperatorDemoStep() {
final List<String> dataList = Arrays.asList(
"{\"id\":1,\"username\":\"张三\",\"password\":\"13BC03AC29FAC7B29736EC3BE5C2F55A\"}",
"{\"id\":2,\"username\":\"李四\",\"password\":\"5E5994FBCFA922D804DF45295AE98604\"}",
"{\"id\":3,\"username\":\"王五\",\"password\":\"6C14DA109E294D1E8155BE8AA4B1CE8E\"}",
"{\"id\":4,\"username\":\"赵六\",\"password\":\"03774AD7979A5909E78F9C9DB3A2F0B2\"}"
);
final Iterator<String> iterator = dataList.iterator();
return stepBuilderFactory.get("jobOperatorDemoStep")
.<String, String>chunk(2)
.reader(new ItemReader<String>() {
@Override
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if(iterator.hasNext()) {
String value = iterator.next();
System.out.println(" ->> read() " + value);
return value;
} else {
return null;
}
}
})
.processor(new ItemProcessor<String, String>() {
@Override
public String process(String item) throws Exception {
String message = "";
if(Objects.nonNull(jobParameters.get("message"))) {
message = String.valueOf(jobParameters.get("message").getValue());
}
Thread.sleep(1000); // 模拟耗时操作
System.out.println(" ->> process() message=" + message + ", item=" + item);
return item.toUpperCase();
}
})
.writer(new ItemWriter<String>() {
@Override
public void write(List<? extends String> items) throws Exception {
System.out.println(" ->> write() " + Arrays.toString(items.toArray()));
}
})
.listener(this)
.build();
}
}使用 start() 方法启动 Job,且传递两个参数(message 和 timestamp),代码如下:
@RestController
@SpringBootApplication
@EnableBatchProcessing // 开启批处理
public class SpringBatchDemoApplication {
@Autowired
private JobOperator jobOperator;
public static void main(String[] args) {
SpringApplication.run(SpringBatchDemoApplication.class, args);
}
@GetMapping("/runJob")
public void runJob(@RequestParam String message) throws Exception {
// 执行任务
Long jobExecutionId = jobOperator.start("jobOperatorDemoJob",
"message=" + message + ",timestamp=" + System.currentTimeMillis());
System.out.println("->> jobExecutionId=" + jobExecutionId);
}
}启动项目,使用浏览器运行 http://localhost:8080/runJob?message=hello 地址,输出日志如下:

通过上面日志可知,启动的任务是一个同步任务,因为“->> jobExecutionId=44”是等待任务完成后才输出。
异步 Job 需要配置 SimpleAsyncTaskExecutor 来执行,因此我们需要在 BatchConfig 配置类中添加如下配置信息:
@Configuration
public class BatchConfig implements StepExecutionListener, ApplicationContextAware {
// 用于创建和配置 Job 对象的工厂类
@Autowired
private JobBuilderFactory jobBuilderFactory;
// 用于创建和配置 Step 对象的工厂类
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobExplorer jobExplorer;
@Autowired
private JobRepository jobRepository;
@Autowired
private JobRegistry jobRegistry;
// JOB参数
private Map<String, JobParameter> jobParameters;
// Spring 应用上下文对象
private ApplicationContext applicationContext;
/**
* 配置异步任务执行器
* @return SimpleAsyncTaskExecutor
*/
@Bean
public TaskExecutor taskExecutor() {
SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
taskExecutor.setConcurrencyLimit(5); // 设置最大并发数
return taskExecutor;
}
/**
* 配置异步 JobLauncher
* @param jobRepository 用于任务数据、状态持久化
* @param taskExecutor 任务执行器
* @return SimpleJobLauncher
*/
@Bean
public JobLauncher asyncJobLauncher(JobRepository jobRepository, TaskExecutor taskExecutor) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.setTaskExecutor(taskExecutor); // 设置异步执行器
return jobLauncher;
}
// 配置 JobOperator
@Bean
public JobOperator jobOperator() {
// 【看这里】使用异步 JobLauncher
TaskExecutor taskExecutor = taskExecutor();
JobLauncher jobLauncher = asyncJobLauncher(jobRepository, taskExecutor);
SimpleJobOperator operator = new SimpleJobOperator();
operator.setJobParametersConverter(new DefaultJobParametersConverter());
operator.setJobRepository(jobRepository);
operator.setJobLauncher(jobLauncher);
operator.setJobExplorer(jobExplorer);
operator.setJobRegistry(jobRegistry);
return operator;
}
// ...参考上面的配置类...
}完成配置后,使用 JobOperator 启动任务:
package com.hxstrive.spring_batch.jobOperatorDemo2;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.launch.JobOperator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Set;
@RestController
@SpringBootApplication
@EnableBatchProcessing // 开启批处理
public class SpringBatchDemoApplication {
@Autowired
private JobOperator jobOperator;
public static void main(String[] args) {
SpringApplication.run(SpringBatchDemoApplication.class, args);
}
@GetMapping("/runJob")
public void runJob(@RequestParam String message) throws Exception {
// 执行任务
Long jobExecutionId = jobOperator.start("jobOperatorDemoJob",
"message=" + message + ",timestamp=" + System.currentTimeMillis());
System.out.println("->> 启动作业 jobExecutionId=" + jobExecutionId);
// 休息片刻
Thread.sleep(1000);
// 停止作业
boolean stopStatus = jobOperator.stop(jobExecutionId);
if(stopStatus) {
System.out.println("->> 作业 " + jobExecutionId + " 停止成功");
// 查看作业信息
String summary = jobOperator.getSummary(jobExecutionId);
System.out.println("->> 作业详细信息:" + summary);
// 获取作业参数信息
String parameters = jobOperator.getParameters(jobExecutionId);
System.out.println("->> 作业参数信息:" + parameters);
// 检查是否还有实例在运行
// 获取 jobOperatorDemoJob 名称的 Job 正在运行的实例ID
Set<Long> runningExecutions = jobOperator.getRunningExecutions("jobOperatorDemoJob");
while(!runningExecutions.isEmpty()) {
Thread.sleep(100); // 如果还有实例在运行,则继续检查
runningExecutions = jobOperator.getRunningExecutions("jobOperatorDemoJob");
}
// 没有实例运行,则重启作业
long restartId = jobOperator.restart(jobExecutionId);
System.out.println("->> 作业 " + jobExecutionId + " 重启,重启后的ID restartId=" + restartId);
} else {
System.err.println("->> 作业 " + jobExecutionId + " 停止失败");
}
}
}上面代码启动一个任务,等待1秒又将任务停止,然后查看作业信息和参数等,最后通过 while() 循环判断名为“jobOperatorDemoJob”的任务有正在执行的实例没有,如果没有,则重启任务。
启动项目,使用浏览器运行 http://localhost:8080/runJob?message=hello 地址,输出日志如下:

下面通过调用 JobOperator 的 getJobInstances() 方法获取名为“jobOperatorDemoJob”的前十个实例ID,然后根据实例ID获取每个实例的执行信息。如下:
@RestController
@SpringBootApplication
@EnableBatchProcessing // 开启批处理
public class SpringBatchDemoApplication {
@Autowired
private JobOperator jobOperator;
public static void main(String[] args) {
SpringApplication.run(SpringBatchDemoApplication.class, args);
}
@GetMapping("/runJob")
public void runJob(@RequestParam String message) throws Exception {
// 获取名为 jobOperatorDemoJob 的 Job 的实例和执行信息
List<Long> jobInstanceIdList = jobOperator.getJobInstances("jobOperatorDemoJob", 0, 10);
for(Long jobInstanceId : jobInstanceIdList) {
List<Long> executionIdList = jobOperator.getExecutions(jobInstanceId); // 获取实例的执行ID列表
for(Long executionId : executionIdList) {
System.out.println("->> ID=" + executionId);
System.out.println(" ->> Parameter=" + jobOperator.getParameters(executionId)); // 获取某个执行的参数
System.out.println(" ->> Summary=" + jobOperator.getSummary(executionId)); // 获取某个执行的概要信息
}
}
}
}启动项目,使用浏览器运行 http://localhost:8080/runJob?message=hello 地址,输出日志如下:

到这里,JobOperator 的用法就介绍完了,更多用法请参考官方文档和API。