是否可以查询正在运行的Spring Batch应用以获取Job执行状态
针对运行中Spring Batch应用的Job状态查询方案
1. 无需改动代码的优先方案
- 查询应用运行日志
你当前的代码已经输出了Job启动的Info日志和异常的Error日志,直接在生产服务器检索日志即可快速获取执行情况:- 如果配置了独立日志文件,直接过滤关键词:
grep "updateNotaryListInfoJob\|updateNotaryDistrictsJob\|ERROR" 你的日志文件路径 - 如果没有配置独立日志,直接检索启动Jar时的输出文件(通常是
nohup.out):grep "SCHEDULED run\|ERROR" nohup.out
- 如果配置了独立日志文件,直接过滤关键词:
- 查询Spring Batch内置元数据表
Spring Batch默认会将所有Job的执行状态、参数、耗时、报错堆栈等信息写入前缀为BATCH_的系统元数据表,只要你配置了持久化数据源(生产环境一般默认配置),直接查询对应表即可:
查最近10次Job执行记录的SQL示例:
查指定Job的失败记录SQL示例:SELECT JOB_EXECUTION_ID, JOB_NAME, STATUS, START_TIME, END_TIME, EXIT_MESSAGE FROM BATCH_JOB_EXECUTION ORDER BY START_TIME DESC LIMIT 10;
如果你的元数据存在H2内存数据库中,需要开启H2控制台才能查询,生产环境建议切换为MySQL、PostgreSQL等持久化数据库存储元数据SELECT * FROM BATCH_JOB_EXECUTION WHERE JOB_NAME = 'updateNotaryListInfoJob' AND STATUS = 'FAILED';
2. 可长期使用的交互方案(需少量改动代码后重启应用)
- 集成Spring Boot Actuator Batch端点
引入Actuator依赖后开启Batch端点,即可通过HTTP请求直接查询所有Job状态、执行历史,还支持手动触发Job执行:- 引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>- 配置文件开启端点暴露:
management: endpoints: web: exposure: include: batch,health endpoint: batch: enabled: true- 启动后访问
http://你的服务IP:端口/actuator/batch/jobs即可获取所有Job信息,访问/actuator/batch/jobs/{jobName}/executions即可获取指定Job的历史执行记录。
生产环境开启Actuator端点建议做好IP白名单、权限校验,避免未授权访问
- 自定义查询接口
如果你不想暴露所有Actuator能力,可以自行编写Controller,注入Spring Batch提供的JobExplorer、JobOperator组件,自定义封装查询逻辑,按需返回Job状态信息。
3. 临时运维交互方案
如果暂时无法重启应用,可以开启JMX远程连接,用JConsole、VisualVM等工具连接到运行中的4677号Java进程,Spring Batch默认会将Job相关操作暴露为JMX Bean,在JMX控制台即可直接查询Job状态、手动触发执行。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

