2014-02-24 150 views
6

我不知道如何使用CommandLineJobRunner调用Spring批处理中定义的作业,但对于我来说文档细节还不够。从命令行运行弹簧批处理作业

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

到目前为止,我有:

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

在Maven的一边,我现在使用的一些插件:

  • maven-jar-plugin指定<addClasspath>true</addClasspath>和包含的主要方法在标签<mainClass>
  • maven-assembly-plugin类,因为我想一个独特的可执行jar含在依赖关系中的所有东西,我使用<phase>package</package>能够在package阶段构建jar,我也使用<goal>single</goal>能够正确使用t构建jar他assembly
  • 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 

抛出IOException由于java.io.FileNotFoundException关于com.package.bla.bla.ClassContainingTheBatchConfiguration。我应该如何在命令行中指定参数才能执行作业?

回答

2

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

+0

哦,我忘了提及包含'main'方法的类是用'@ EnableAutoConfiguration'注解的。我实际上想对我可以运行的工作有某种控制,即选择'SpringApplication.run(...)'应该运行哪个工作。这就是为什么我想我可能会使用'CommandLineJobRunner'来提供一个带注释的类而不是XML配置文件。 – TPPZ

+1

使用'@ EnableAutoConfiguration',您可以设置“spring.batch.jobName”(最多RC3)或“spring.batch.jobNames”(自昨天起)列出要执行的作业(请参阅https://github.com /spring-projects/spring-boot/blob/master/docs/howto.md#execute-spring-batch-jobs-on-startup)。如果你愿意,你可以在你的主要方法中做到这一点,但最好在命令行上传递它(有点像你试图用CLJR做的那样)。 –

+0

这听起来像个好消息!那么我应该如何指定这个'spring.batch.jobName'参数?我想我可以在'@ EnableAutoConfiguration'(它调用'BatchAutoConfiguration')附近设置一些东西,但事实并非如此。我将Maven中的Spring Boot父版本设置为'1.0.0.RC3'。 (我对Spring相当陌生,坚持使用文档和源代码浏览) – TPPZ

1

如果第一个参数CommandLineJobRunner是你@Configuration FQCN而不是资源路径的ClassPathXmlApplicationContext构造函数是一个从CommandLineJobRunnerstart()方法称为将打破。

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

    ConfigurableApplicationContext context = null; 

    try { 
     context = new ClassPathXmlApplicationContext(jobPath); 

如果您已经编写了main()一类,它取代了CLJR,你不应该传递CLJR作为命令行的类名。代之以传递。

+0

是的,我怀疑这一点,我不确定。那么,在包含'main'方法的类中,我想明确指定应该运行哪个工作。尽管如此,我无法通过SpringApplication.run(...)使用'main'方法。 – TPPZ

+1

'java -jar ... --spring.batch.jobNames = myJobName'不起作用? –

+1

@DaveSyer:这个命令看起来不错。如何传递作业参数,以及如何在作业配置bean中推断相同的作业? – PavanSandeep

相关问题