2016-02-19 72 views
1

我想寫一些代碼是一致的和風格正確的春季批量啓動,我在尋找一些反饋。在配置讀寫器時,Spring Boot批處理用例可用於jobParameters和@ JobScope/@ StepScope over Environment/@ ConfigurationProperties?

彈簧批次經典步驟-範圍例如:

@Bean 
@StepScope 
public FlatFileItemReader<Partner> reader(
     @Value("#{jobParameters[pathToFile]}") String pathToFile){ 
    FlatFileItemReader<Partner> itemReader = new FlatFileItemReader<Partner>(); 
    itemReader.setLineMapper(lineMapper()); 
    itemReader.setResource(new ClassPathResource(pathToFile)); 
    return itemReader; 
} 

pathToFile作爲來自命令行傳遞作業參數被獲得。由於後期綁定,因此需要步驟範圍。

在Spring Boot中,從命令行傳遞的所有參數都會自動添加到環境中,並且它們也可用於創建爲@ConfigurationProperties的bean。

步範圍例如重構:

@Bean 
@ConfigurationProperties(prefix = "my.prefix") 
protected class JobProperties { 

    String pathToFile; 

    ...getters/setters 
} 

@Autowired 
private JobProperties jobProperties; 

@Bean 
public FlatFileItemReader<Partner> reader() { 
    FlatFileItemReader<Partner> itemReader = new FlatFileItemReader<Partner>(); 
    itemReader.setLineMapper(lineMapper()); 
    String pathToFile = jobProperties.getPathToFile(); 
    itemReader.setResource(new ClassPathResource(pathToFile)); 
    return itemReader; 
} 

假設SpringApplication.setAddCommandLineProperties(假)是不會被設置,是在那裏有@StepScope優選將環境/ @ ConfigurationProperties的情況下進場?在風格上,Spring Boot是更好的方法嗎? (通過代碼挖掘自動配置肯定依賴於@ConfigurationProperties)。

回答

1

這兩種方法之間有幾個區別。

一,你基本上是通過進入SpringBatch不知道的全局狀態來配置工作。這在Spring Batch中失敗了與作業參數相關的功能。例如,Spring Batch會拒絕使用相同的參數執行兩次相同的作業。重新開始工作也會遇到更多的麻煩,因爲您必須確保在兩次運行之間您在Spring Batch之外設置的狀態是相同的。二,你失去了通過命令行以外的其他方式啓動任務的可能性(或者至少你需要實現其他方法來提供相同的全局狀態)。如果您想同時運行多個作業,或者您想通過功能測試來測試作業,這會造成問題。

第三,這兩種方法的reader bean的範圍不同。在您的@StepScope示例中,bean的範圍設置爲step,在重構示例中,範圍是singleton。在後一種情況下,將只有一個bean的對象實例;在前者中,每一步都會有一個新實例請求該bean(也會有一個singleton作用域代理,以便可以以不同的方式將bean注入到scope中)。

最後,使用@StepScope,您還可以注入步驟ExecutionContext中的對象,而不會通過例如「 ChunkContext,它簡化了代碼和可測試性。

順便說一下,在您的第一個示例中,reader只需要​​d即可注入作業參數。

+0

這些都是好點。我的主要用例是命令行,Spring引導將使用本地配置文件執行作業,因此全局狀態的大部分將在那裏進行管理。我提供了一個RunIdIncrementer,所以至少有run.id = 1,2,3 ...附加到作業中。也就是說我想採用一些約定,將來可以在容器/管理器中運行這些約定,而且你所說的話是有道理的。 –

相關問題