Search code examples
spring-batch

Spring Boot 3: Batchapplication with modular contexts doesnt start any jobs


I upgraded to Spring Boot 3 and all of a sudden my batch application doesn't start any jobs when I specify them via --spring.batch.job.names.

This is my main class:

@SpringBootApplication
@EnableJpaRepositories("path.to.my.repositories")
@EntityScan("path.to.my.entities")
public class MyBatchApplication{
    public static void main(String[] args) {
        System.exit(SpringApplication.exit(SpringApplication.run(MyBatchApplication.class, args)));
    }

}

This is my config

@Configuration
@EnableBatchProcessing(modular = true)
public class MyModularBatchJobContextConfiguration {
    @Bean
    ApplicationContextFactory getJobAContext() {
        return new GenericApplicationContextFactory(JobAConfig.class);
    }

    @Bean
    ApplicationContextFactory getJobBContext() {
        return new GenericApplicationContextFactory(JobBConfig.class);
    }
}

and JobA.class and JobB.class basically the same like:

public class JobAConfig {

    private static final String MY_JOB_NAME = "jobA"

    @Autowired
    private EntityManagerFactory emf;

    @Bean
    public Job jobA(JobRepository jobRepository, Step myStep) {
        return new JobBuilder(MY_JOB_NAME, jobRepository)
                .flow(myStep)
                .end()
                .build();
    }

    @Bean
    public Step myStep(JpaTransactionManager transactionManager,
                       JobRepository jobRepository,
                       FlatFileItemReader<MyEntity> reader,
                       ItemProcessor<MyEntity, MyEntity> processor,
                       JpaItemWriter<MyEntity> entityWriter) {
        return new StepBuilder(MY_STEP_NAME, jobRepository)
                .<MyEntity, MyEntity>chunk(10, transactionManager)
                .reader(reader)
                .processor(processor)
                .writer(plzOrtEntityWriter)
                .transactionManager(transactionManager)
                .build();
    }

// Reader, Writer, Processor...

when i run the jar with java -jar mybatchapplication.jar --spring.batch.job.names=jobA nothing happens, the job is not started.

2023-05-11T22:05:21.823+02:00  INFO 9716 --- [           main] d.f.r.batch.MyBatchApplication: Starting MyBatchApplicationusing Java 17.0.5 with PID 9716 (C:\gits\mygit\batch\target\mybatchapplication.jar started by me in C:\gits\mygit)
2023-05-11T22:05:21.825+02:00  INFO 9716 --- [           main] d.f.r.batch.MyBatchApplication: No active profile set, falling back to 1 default profile: "default"
2023-05-11T22:05:22.112+02:00  INFO 9716 --- [           main] o.s.b.c.c.annotation.BatchRegistrar      : Finished Spring Batch infrastructure beans configuration in 6 ms.
2023-05-11T22:05:22.118+02:00  INFO 9716 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2023-05-11T22:05:22.149+02:00  INFO 9716 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 25 ms. Found 2 JPA repository interfaces.
2023-05-11T22:05:22.571+02:00  INFO 9716 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-05-11T22:05:22.616+02:00  INFO 9716 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.1.7.Final
2023-05-11T22:05:22.895+02:00  INFO 9716 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-05-11T22:05:22.995+02:00  INFO 9716 --- [           main] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Driver does not support get/set network timeout for connections. (Receiver class org.h2.jdbc.JdbcConnection does not define or inherit an implementation of the resolved method 'abstract int getNetworkTimeout()' of interface java.sql.Connection.)
2023-05-11T22:05:22.998+02:00  INFO 9716 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:file:~/mydb user=SA
2023-05-11T22:05:22.999+02:00  INFO 9716 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-05-11T22:05:23.016+02:00  INFO 9716 --- [           main] SQL dialect                              : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2023-05-11T22:05:23.542+02:00  INFO 9716 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-05-11T22:05:23.552+02:00  INFO 9716 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2023-05-11T22:05:23.588+02:00  INFO 9716 --- [           main] o.s.b.c.r.s.JobRepositoryFactoryBean     : No database type set, using meta data indicating: H2
2023-05-11T22:05:23.613+02:00  INFO 9716 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : No TaskExecutor has been set, defaulting to synchronous executor.
2023-05-11T22:05:24.294+02:00  WARN 9716 --- [           main] o.s.b.c.l.AbstractListenerFactoryBean    : org.springframework.batch.item.ItemProcessor is an interface. The implementing class will not be queried for annotation based listener configurations. If using @StepScope on a @Bean method, be sure to return the implementing class so listener annotations can be used.
2023-05-11T22:05:24.322+02:00  INFO 9716 --- [           main] .c.a.BatchObservabilityBeanPostProcessor : No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
2023-05-11T22:05:24.358+02:00  INFO 9716 --- [           main] .c.a.BatchObservabilityBeanPostProcessor : No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
2023-05-11T22:05:24.370+02:00  WARN 9716 --- [           main] o.s.b.c.l.AbstractListenerFactoryBean    : org.springframework.batch.item.ItemProcessor is an interface. The implementing class will not be queried for annotation based listener configurations. If using @StepScope on a @Bean method, be sure to return the implementing class so listener annotations can be used.
2023-05-11T22:05:24.371+02:00  INFO 9716 --- [           main] .c.a.BatchObservabilityBeanPostProcessor : No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
2023-05-11T22:05:24.371+02:00  INFO 9716 --- [           main] .c.a.BatchObservabilityBeanPostProcessor : No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
2023-05-11T22:05:24.395+02:00  INFO 9716 --- [           main] d.f.r.batch.MyBatchApplication: Started MyBatchApplicationin 2.848 seconds (process running for 3.242)
2023-05-11T22:05:24.406+02:00  INFO 9716 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2023-05-11T22:05:24.410+02:00  INFO 9716 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-05-11T22:05:24.417+02:00  INFO 9716 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Does anybody know whats wrong here? I also tried with --spring.batch.job.name=, no success.


Solution

  • With Spring Boot 3, there is no need for @EnableBatchProcessing. If you add it, the auto-configuration of Spring Batch (meta-data tables creation, launching of jobs at startup, etc) will back off. This is mentioned in the migration guide of Spring Boot 3.

    So in your case, if you want to modularize your context, you have two options:

    • Either continue using @EnableBatchProcessing to benefit from modular = true, but in that case you have to manually do what Spring Boot used to previously do (ie initialize the database, run the job at startup, etc).
    • Or remove @EnableBatchProcessing (to benefit from Boot 3 features as before), but in that case you need to modularize your context manually