2016-03-19 165 views
0

我對Spring Batch很熟悉,因爲我相信這是我們的項目需要替換我們當前的代碼庫(以使開發更快,更容易測試)。Spring批處理 - 動態作業選擇

我們當前的代碼庫有以下的,重要的特性:

  • 一個代碼庫 - 但很多間歇過程(我們重用批處理之間的代碼)
  • 目前,我們有多個的main()方法在代碼庫中,只是有不同的shell腳本來調用適當的主類。

我期待,以解決春季批次以下問題:

我已經開始了一個假人,試驗基礎上,Spring Batch的示例項目:https://spring.io/guides/gs/batch-processing/

我想保持多批量過程(就業機會,如果我們談論Spring Batch,我會採用)在同一個代碼庫中。然而,目前,如果我添加更多的Job罪我的代碼,他們都得到執行。更糟糕的是,我在SpringBoot主類中添加了一個Application Listener,事實證明,Jobs在ApplicationReadyEvent之前被執行 - 這對我來說似乎很糟糕,就像在構造函數中運行業務邏輯一樣。

我的問題是:

  • 我如何選擇我想要運行的作業(基於命令行參數)
  • 我怎樣才能確保這項工作啓動後,ApplicationReadyEvent

在此先感謝。

回答

0

我的解決辦法如下:

  • 設置spring.batch.job。enabled屬性設置爲false - 這阻礙了工作,開始時,背景是建立

  • 獲取JobLauncher出的背景下,並運行任何工作我:

    SpringApplication app = new SpringApplication(BatchProcessingServiceStarter.class); 
    app.setWebEnvironment(false); 
    
    ConfigurableApplicationContext ctx=app.run(args); 
    JobLauncher jobLauncher = ctx.getBean(JobLauncher.class); 
    JobParameters jobParameters = new JobParametersBuilder() 
        .addDate("date", new Date()) 
        .toJobParameters(); 
    
    if(!"1".equals(args[0])){  
        jobLauncher.run(ctx.getBean("BatchConfiguration2", Job.class), jobParameters);     
    } else { 
        jobLauncher.run(ctx.getBean("BatchConfiguration1", Job.class), jobParameters); 
    } 
    
1

有各種各樣的問題。

1. 要禁用啓動時自動啓動所有工作只是配置此Spring Boot property

spring.batch.job.enabled=false # Do not execute all Spring Batch jobs in the context on startup. 

2. 你會運行作業是這樣的:

java -Dspring.batch.job.names=prepareTeaJob -jar target/0910-job-parameters-cli-0.0.2-SNAPSHOT.jar sugarAmount="no sugar" 

糖量有工作參數。屬於此列表的完整示例託管在my Github Repository here中。順便說一句,如果您正在學習Spring Batch,還有更多涵蓋這些各種Spring Batch主題的示例。

3. 不確定你指的是「ApplicationReadyEvent」。 AFAIK作業應該在完全初始化的Spring上下文之後執行。