是否可以動態創建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的任何內容嗎?
感謝您的快速反應!我是Spring Batch和Spring中的新成員。你能否更詳細地解釋你的答案?你的意思是我可以在運行時用我的作業創建Spring配置,並根據這個生成的配置啓動一個更多的子ApplicationContext? – JuISe
我的意思是你要顯示的第一塊代碼應該放在用'@ Configuration'註解的類中,而'createJob'方法應該放在'@ Bean'上。然後,當你開始工作時,你需要從該類創建一個新的'ApplicationContext'(https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ AnnotationConfigApplicationContext.html)。 –
我可以有很多的作業(每MyXmlJobConfig參數有關createJob法)。在啓動我的程序並加載MyXmlJobConfig之前,我不知道這些作業由哪些'Steps'組成。如果我通過'@ Bean'和'@Scope(「prototype」)'註釋createJob方法來獲得像這樣''context.getBean(「createJob」,configXmlParams)這樣的工具,它會是一個正確的方法嗎? – JuISe