2017-08-02 691 views
0

是否可以動態創建Spring Batch的工作as not a bean動態創建Spring Batch的工作

我已經創作了大量的讀者,作家,處理器和其它任務蕾的,我想有可能從這些部位運行時創建工作。

我有我的基於XML的格式,保存在某些目錄中的一些職位描述文件。這些作業描述可以包含有關作業的動態信息,例如,讀者和作者爲此作業選擇的內容。 程序啓動時,將解析這些文件,並創建相應的作業。

我想實現這樣的:

@Autowired 
private JobBuilderFactory jobBuilderFactory; 

@Autowired 
private StepBuilderFactory stepBuilderFactory; 

@Autowired 
private ApplicationContext context; 

public Job createJob(MyXmlJobConfig jobConfig) { 

    // My predefined steps in context 

    Step initStep = context.getBean("InitStep", Step.class); 

    Step step1 = context.getBean("MyFirstStep", Step.class); 
    Step step2 = context.getBean("MySecondStep", Step.class); 
    //...... 

    // Mix these steps to build job 

    JobBuilder jobBuilder = jobBuilderFactory.get("myJob"); 
    SimpleJobBuilder simpleJobBuilder = jobBuilder.start(initStep); 


    // Any logic of steps mixing and choosing 
    if(jobConfig.somePredicate()) 
     simpleJobBuilder.next(step1); 
    else 
     simpleJobBuilder.next(step2); 
    //......... 


    //....... 

    return simpleJobBuilder.build(); 
} 

用例:

JobLauncher jobLauncher = context.getBean(JobLauncher.class); 
MyXmlJobConfig config = getConfigFromFile(); // Loading config from file 

MyCustomJobBuilder myCustomJobBuilder = context.getBean(MyCustomJobBuilder.class); 
Job createdJob = myCustomJobBuilder.createJob(config); 
jobLauncher.run(createdJob, new JobParameters()); 

是工作的正確建立這種做法?請注意createdJob不是一個bean。它不會在幕後破壞Spring Batch的任何內容嗎?

回答

0

Spring Batch的使用Spring DI容器及相關配套設施相當廣泛。代理作業或步長範圍的bean只是一個例子。整個基於XML的定義的解析結果爲BeanDefinitions。你可以創建一個Spring批處理作業而不使它成爲一個bean嗎?當然。我會推薦它嗎?編號

請記住,您可以在其中動態創建子實例的方法。您可以在其中創建子實例。Spring Batch Admin和Spring XD都利用此功能動態創建Spring Batch作業實例。我推薦這種方法,首先讓作業不是ApplicationContext的一部分。

+0

感謝您的快速反應!我是Spring Batch和Spring中的新成員。你能否更詳細地解釋你的答案?你的意思是我可以在運行時用我的作業創建Spring配置,並根據這個生成的配置啓動一個更多的子ApplicationContext? – JuISe

+0

我的意思是你要顯示的第一塊代碼應該放在用'@ Configuration'註解的類中,而'createJob'方法應該放在'@ Bean'上。然後,當你開始工作時,你需要從該類創建一個新的'ApplicationContext'(https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ AnnotationConfigApplicationContext.html)。 –

+0

我可以有很多的作業(每MyXmlJobConfig參數有關createJob法)。在啓動我的程序並加載MyXmlJobConfig之前,我不知道這些作業由哪些'Steps'組成。如果我通過'@ Bean'和'@Scope(「prototype」)'註釋createJob方法來獲得像這樣''context.getBean(「createJob」,configXmlParams)這樣的工具,它會是一個正確的方法嗎? – JuISe