【问题标题】:Running Spring Batch jobs from the command line从命令行运行 Spring Batch 作业
【发布时间】:2014-02-24 16:47:37
【问题描述】:

我不知道如何使用 CommandLineJobRunner 调用 Spring Batch 中定义的 Job,文档详细信息对我来说还不够。

我已经按照Spring Batch official guide 使用 Java 注释在 Spring Batch 中编写作业,例如@EnableBatchProcessing 因为我想避免使用 XML 配置文件来描述工作、步骤等。

到目前为止我有:

  • 一个配置类(com.package.bla.bla.ClassContainingTheBatchConfiguration 见下文),我将所有定义 ItemReaderItemProcessorItemWriterJobStep 的东西放在其中(return jobs.get("nameOfTheJob") 见下文)使用 @Bean 注释。
  • 一个带有main 方法和SpringApplication.run(...) 和带有@ImportResource("classpath:META-INF/spring/applicationContext.xml") 注释的类,用于导入我在作业中处理数据时需要的一些bean。

在 Maven 方面,我目前正在使用一些插件:

  • maven-jar-plugin 指定<addClasspath>true</addClasspath> 和标签<mainClass> 中包含main 方法的类
  • maven-assembly-plugin 因为我想要一个独特的可执行文件jar 包含依赖项中的所有内容,我使用<phase>package</package> 能够在package 阶段构建jar,我也使用<goal>single</goal>能够使用assembly 正确构建 jar
  • maven-compiler-plugin 指定我使用的是 Java 1.7

我想我已经配置了我需要配置的所有东西,但是在拥有 Maven BUILD SUCCESS 之后,我无法从命令行运行该作业:

java -cp ./target/JAR_FILE_NAME.jar org.springframework.batch.core.launch.support.CommandLineJobRunner com.package.bla.bla.ClassContainingTheBatchConfiguration nameOfTheJob

由于java.io.FileNotFoundExceptioncom.package.bla.bla.ClassContainingTheBatchConfiguration 相关,正在抛出IOException。我应该如何在命令行中指定参数以执行作业?

【问题讨论】:

  • 文档的“细节”很荒谬。我很难想象仅基于文档来运行现有的工作。我只是想知道创造这份工作的人的学习曲线是什么......

标签: spring maven maven-plugin spring-batch


【解决方案1】:

如果您已经在使用 Spring Boot 中的 SpringApplication,为什么不完成这项工作并同时使用 @EnableAutoConfiguration 以及 Maven 插件(例如参见 this guide)?这样一来,您就可以很快地得到一些东西,并且您以后可以随时添加自己的功能。

【讨论】:

  • 哦,我忘了提到包含main 方法的类是用@EnableAutoConfiguration 注释的。我实际上想对我可以运行的作业进行某种控制,即选择应该由SpringApplication.run(...) 运行的作业。这就是为什么我认为也许我可以以某种方式使用 CommandLineJobRunner 提供带注释的类而不是 XML 配置文件。
  • 使用@EnableAutoConfiguration,您可以设置“spring.batch.jobName”(最高 RC3)或“spring.batch.jobNames”(从昨天开始)列出要执行的作业(参见此处:@ 987654322@)。如果您愿意,您可以在您的主要方法中执行此操作,但最好在命令行上传递它(有点像您尝试使用 CLJR)。
  • 这听起来是个好消息!那么我应该如何指定这个spring.batch.jobName 参数?我以为我可以在@EnableAutoConfiguration (调用BatchAutoConfiguration)附近设置一些东西,但事实并非如此。我已将 Maven 中的 Spring Boot 父版本设置为 1.0.0.RC3。 (我对 Spring 很陌生,并且坚持使用文档和源代码浏览)
  • 如果您对 Spring 不是很熟悉,为什么不尝试通过一些 the guides 工作? Boot 应用程序中的外部化配置在各个地方都有介绍,包括 here
  • 要使用命令行向环境添加属性,您需要在参数中添加“--”(我将在文档中更清楚地说明这一点)。您可能也想要jobNames 而不是job.names(但如果幸运的话,它可能适用于该时期)。
【解决方案2】:

如果CommandLineJobRunner 的第一个参数是您的@Configuration FQCN 而不是资源路径,则从CommandLineJobRunnerstart() 方法调用的ClassPathXmlApplicationContext 构造函数将中断。

int start(String jobPath, String jobIdentifier, String[] parameters, Set<String> opts) {

    ConfigurableApplicationContext context = null;

    try {
        context = new ClassPathXmlApplicationContext(jobPath);

如果您已经编写了一个带有main() 的类,它替换了CLJR,那么您不应该在命令行中将CLJR 作为类名传递。而是通过它。

【讨论】:

  • 是的,我怀疑,我不确定。好吧,在包含main 方法的类中,我想明确指定应该运行哪个作业。我找不到使用main 方法和SpringApplication.run(...) 的方法。
  • java -jar ... --spring.batch.jobNames=myJobName 没用?
  • @DaveSyer :这个命令看起来不错。如何传递作业参数以及如何在作业配置 bean 中推断相同的参数?
【解决方案3】:

不要使用 spring.batch.job.enabled=false 然后使用 java -jar [jar-files] --spring.batch.job.names=[job-name]

运行

【讨论】:

  • 嗨 AndreLucky - 请您在回答中添加更多细节吗?我很想知道它是如何以及为什么起作用的?
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多