2014-02-24 193 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

相關問題