如何根据应用程序参数选择要运行的Spring批处理作业 - spring boot java config

ama*_*der 10 spring spring-batch spring-boot spring-java-config

我在同一个项目中有两个独立的弹簧批处理作业,因为我想使用相同的基础结构相关的bean.一切都是用Java配置的.我想知道是否有一种正确的方法来启动独立的作业,例如在main方法中的第一个java app参数上.如果我SpringApplication.run只运行第二个作业就会被魔术执行.主要方法如下:

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {                
        SpringApplication app = new SpringApplication(Application.class);
        app.setWebEnvironment(false);
        ApplicationContext ctx= app.run(args);              
    }

}
Run Code Online (Sandbox Code Playgroud)

并且这两个作业的配置如Spring.io上的Spring Batch入​​门教程中所示.这是第一个作业的配置文件,第二个作业以相同的方式配置.

@Configuration
@EnableBatchProcessing
@Import({StandaloneInfrastructureConfiguration.class, ServicesConfiguration.class})
public class AddPodcastJobConfiguration {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    //reader, writer, processor...

}
Run Code Online (Sandbox Code Playgroud)

为了启用模块化,我创建了一个AppConfig类,在这里我为两个作业定义了工厂:

@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig {

    @Bean
    public ApplicationContextFactory addNewPodcastJobs(){
        return new GenericApplicationContextFactory(AddPodcastJobConfiguration.class);
    }

    @Bean
    public ApplicationContextFactory newEpisodesNotificationJobs(){
        return new GenericApplicationContextFactory(NotifySubscribersJobConfiguration.class);
    }    

}
Run Code Online (Sandbox Code Playgroud)

PS我是Java配置Spring Boot和Spring Batch中的Spring配置新手...

Han*_*ier 17

只需设置"spring.batch.job.names = myJob"属性即可.您可以在启动应用程序时将其设置为SystemProperty(-Dspring.batch.job.names = myjob).如果已定义此属性,则spring-batch-starter将仅启动由此属性定义的作业.


ama*_*der 11

要从main方法运行您喜欢的作业,您可以从应用程序上下文加载所需的作业配置bean和JobLauncher,然后运行它:

@ComponentScan
@EnableAutoConfiguration
public class ApplicationWithJobLauncher {

    public static void main(String[] args) throws BeansException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, InterruptedException {

        Log log = LogFactory.getLog(ApplicationWithJobLauncher.class);

        SpringApplication app = new SpringApplication(ApplicationWithJobLauncher.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])){
            //addNewPodcastJob
            Job addNewPodcastJob = ctx.getBean("addNewPodcastJob", Job.class);          
            JobExecution jobExecution = jobLauncher.run(addNewPodcastJob, jobParameters);                   
        } else {
            jobLauncher.run(ctx.getBean("newEpisodesNotificationJob",  Job.class), jobParameters);   

        } 

        System.exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

造成我很多困惑的原因是第二份工作被执行了,即使第一份工作似乎被跑步者"捡到"......问题是在两个工作的配置文件中我都使用了标准的方法名称writer(), reader(), processor() and step()和它使用了第二个作业中那些似乎从第一个作业"覆盖"而没有任何警告的作业......我使用了一个应用程序配置类@EnableBatchProcessing(modular=true),我认为它会被Spring Boot神奇地使用:

@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig {

    @Bean
    public ApplicationContextFactory addNewPodcastJobs(){
        return new GenericApplicationContextFactory(AddPodcastJobConfiguration.class);
    }

    @Bean
    public ApplicationContextFactory newEpisodesNotificationJobs(){
        return new GenericApplicationContextFactory(NotifySubscribersJobConfiguration.class);
    }    

}
Run Code Online (Sandbox Code Playgroud)

我会在准备好的时候写一篇关于它的博客文章,但在此之前,代码可以在https://github.com/podcastpedia/podcastpedia-batch(工作/学习进行中)获得.