Spring batch 在Spring批处理中动态创建作业
是否可以将Spring批处理作业动态创建为非bean 我已经创建了很多阅读器、编写器、处理器和其他Tasklet,我希望能够从这些部分在运行时构建作业 我有一些基于xml格式的工作描述文件,保存在某个目录中。这些工作描述可以包含关于工作的动态信息,例如,读者和作者为此工作选择了什么。 当程序启动时,将解析这些文件,并且必须创建相应的作业 我想这样实施:Spring batch 在Spring批处理中动态创建作业,spring-batch,Spring Batch,是否可以将Spring批处理作业动态创建为非bean 我已经创建了很多阅读器、编写器、处理器和其他Tasklet,我希望能够从这些部分在运行时构建作业 我有一些基于xml格式的工作描述文件,保存在某个目录中。这些工作描述可以包含关于工作的动态信息,例如,读者和作者为此工作选择了什么。 当程序启动时,将解析这些文件,并且必须创建相应的作业 我想这样实施: @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired priv
@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 DI容器和相关设施。代理作业或步骤范围的bean只是一个例子。对基于XML的定义的整个解析将导致BeanDefinitions。您可以构建一个Spring批处理作业而不使其成为bean吗?当然我可以推荐它吗?没有
请记住,有一些方法可以动态创建子ApplicationContext实例,您可以在其中进行作业。Spring Batch Admin和Spring XD都利用此功能动态创建Spring批处理作业的实例。我建议使用这种方法,而不是首先让工作不属于应用程序上下文。感谢您的快速响应!我对春天和春天都是新手。С请你详细解释一下你的答案好吗?你的意思是我可以在运行时用我的作业创建Spring配置,并根据生成的配置启动另一个子ApplicationContext吗?我的意思是你显示的第一块代码应该在一个用@configuration注释的类中,并且createJob方法应该有一个@Bean。然后,当您启动作业时,您将从该类创建一个新的ApplicationContext。在启动程序并加载MyXmlJobConfig之前,我不知道这些作业是从哪个步骤开始的。如果我通过@Bean和@Scopeprototype注释createJob方法,以获得一个工具,使我的作业类似于此context.getBeancreateJob,configXmlParams是正确的方法吗?