Spring batch 在Spring批处理中动态创建作业

Spring batch 在Spring批处理中动态创建作业,spring-batch,Spring Batch,是否可以将Spring批处理作业动态创建为非bean 我已经创建了很多阅读器、编写器、处理器和其他Tasklet,我希望能够从这些部分在运行时构建作业 我有一些基于xml格式的工作描述文件,保存在某个目录中。这些工作描述可以包含关于工作的动态信息,例如,读者和作者为此工作选择了什么。 当程序启动时,将解析这些文件,并且必须创建相应的作业 我想这样实施: @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired priv

是否可以将Spring批处理作业动态创建为非bean

我已经创建了很多阅读器、编写器、处理器和其他Tasklet,我希望能够从这些部分在运行时构建作业

我有一些基于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 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是正确的方法吗?