
Spring Boot 如何从命令行运行 Spring Boot 应用中的 Spring Batch 作业并重启失败的 Job【免费下载链接】spring-bootSpring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss.项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot如果你用 Spring Boot 封装了一个包含 Spring Batch 作业Job的应用需要解决两个问题一是怎么在命令行上正确地给作业传参数二是作业执行失败之后重新拉起时该传哪些参数。Spring Boot 在自动配置 Spring Batch 时会在启动时执行应用上下文中的Job同时把命令行参数分为“Spring 环境属性”和“Batch 作业参数”两类混用会导致参数根本传不进去。本文基于 Spring Boot 官方 how-to 文档与参考文档给出这条操作路径。运行前提Spring Boot 会自动启动你的 JobSpring Boot 自动配置 Spring Batch 时行为如下见 io/spring-batch.adoc上下文中有且只有一个Jobbean 时启动应用即执行该 Job由JobLauncherApplicationRunner完成有多个Jobbean 时必须用spring.batch.job.name指定要执行哪一个例如spring: batch: job: name: importJob不希望启动时自动执行 Job可以关闭spring: batch: job: enabled: false如果你把作业元数据存在 SQL 数据库中应用还需要一个javax.sql.DataSourcebean默认要求唯一的DataSourcebean。需要让 Spring Batch 使用区别于应用主数据源的数据源时声明对应的DataSourcebean 并在Bean方法上加BatchDataSource注解此时若想保留自动配置的主数据源把Bean的defaultCandidate属性设为false见 how-to/batch.adoc。从命令行传作业参数不要用--前缀Spring Boot 会把所有以--开头的命令行参数转换为 SpringEnvironment中的属性即普通 Spring 配置项。官方文档明确说明不要用这种方式给 batch 作业传参。作业参数使用不带--的普通namevalue格式$ java -jar myapp.jar someParametersomeValue anotherParameteranotherValue这一点可以通过混合命令来验证文档描述的行为$ java -jar myapp.jar --server.port7070 someParametersomeValue按照文档这条命令只会给 batch 作业提供一个参数someParametersomeValue--server.port7070进入的是 Spring 环境作业侧会忽略它命令行属性的转换规则见 external-config.adoc 的 “Accessing Command Line Properties” 一节。因此你可以这样判断参数是否正确送达用--传的值作业读不到不带--的namevalue才是作业收到的参数。如果多个 Job 共存选择要运行的 Job 用的spring.batch.job.name本身是一个 Spring 属性所以它要用--形式传$ java -jar myapp.jar --spring.batch.job.nameimportJob someParametersomeValue重启失败的 Job所有参数必须重新指定这是最容易踩的坑。官方文档how-to/batch.adoc 的 “Restarting a Stopped or Failed Job” 一节的规则是重启一个失败的Job时所有参数——包括识别型参数identifying和非识别型参数non-identifying——都必须在命令行上重新指定非识别型参数不会从上一次执行中自动带过来重新指定后才能被修改或移除注意如果你使用了自定义的JobParametersIncrementer重启失败的执行时必须收集该 incrementer 管理的全部参数否则重启无法完成。对应到上一条的启动命令重启时应把作业参数完整写回去例如$ java -jar myapp.jar --spring.batch.job.nameimportJob someParametersomeValue anotherParameteranotherValue需要改变某个参数取值时直接在重启命令里替换它的值即可想删掉某个非识别型参数就不在命令行中指定它。结果验证与限制参数是否送达以文档示例为准java -jar myapp.jar --server.port7070 someParametersomeValue中作业只能收到someParametersomeValue。进程退出码BatchJobLauncherAutoConfiguration会在上下文中没有自定义ExitCodeGenerator时自动注册JobExecutionExitCodeGenerator见 BatchJobLauncherAutoConfiguration.java它把作业执行的退出码传播为应用退出码。因此java -jar进程的退出状态可以反映本次 Job 的执行结果重启时可用它确认作业是否真正成功。以下限制需要注意--参数只影响 Spring 环境永远不会作为作业参数出现反过来把本应作为环境属性的值写成不带--的格式它也不会进入Environment。如果你在自己的配置类上加了EnableBatchProcessing或继承DefaultBatchConfiguration来手动接管 Spring Batch 配置Spring Boot 的自动配置包括 Batch 数据库/MongoDB schema 初始化会整体退避此时命令行启动行为以你自己的配置为准。识别型参数决定“这是否是同一个逻辑作业实例”重启时不要随意改它们的值否则会被当作一次新的作业执行而不是重启。这一条是 Spring Batch 的通用语义官方 how-to 文档强调的重点是重启必须把所有参数重新写回命令行。完整细节可继续阅读 Batch Applicationshow-to 与 Spring Batchreference 两篇官方文档。【免费下载链接】spring-bootSpring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss.项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考