Modular ApplicationContext Spring Batch with SpringBoot

Viewed 28

I have two Spring Batch jobs inside one Spring Boot application.
I am trying to use org.springframework.batch.core.configuration.support.ApplicationContextFactory to have separate ApplicationContext to avoid bean name collison. I found spring-batch-with-modular-true-doesnt-work-for-multiple-jobs but I am unable to make it work. The jobs are not launching.

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

    @Bean
    public ApplicationContextFactory one() {
        return new GenericApplicationContextFactory(JobConfig1.class);
    }
 
    @Bean
    public ApplicationContextFactory two() {
        return new GenericApplicationContextFactory(JobConfig2.class);
    }
    
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreDuringScan {
    
}
@Configuration
@IgnoreDuringScan
public class JobConfig1 { ... }
@Configuration
@IgnoreDuringScan
public class JobConfig2 { ... }
@SpringBootApplication
@ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class))
public class MainApplication { ...}
1 Answers

if you need just start two job, you do not need two separately ApplicationContext.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


@Autowired
private JobBuilderFactory jobBuilderFactory;


@Bean
public JobExecutionListener jobExecutionListener() {
    return new JobExecutionListener() {
        @Override
        public void beforeJob(JobExecution jobExecution) {
            ...
        }

        @Override
        public void afterJob(JobExecution jobExecution) {
            ...
        }
    };
}

@Bean
public Job job1(Step step1, Step step2) {
    return jobBuilderFactory.get("job1")
            .incrementer(new RunIdIncrementer())
            .listener(jobExecutionListener())
            .start(step1)
            .next(step2)
            .build();
}

@Bean
public Job job2(Step step3, Step step4) {
    return jobBuilderFactory.get("job2")
            .incrementer(new RunIdIncrementer())
            .listener(jobExecutionListener())
            .start(step3)
            .next(step4)
            .build();
}
Related