定义内存中的JobRepository

Chr*_*riX 3 spring-batch spring-boot

我正在使用Spring启动测试Spring Batch.我需要定义在Oracle数据库上工作的作业,但我不想在此数据库中保存作业和步骤状态.我在文档中读到了我可以使用MapJobRepositoryFactoryBean的内存存储库.

然后,我实现了这个bean:

@Bean
    public JobRepository jobRepository() {
        MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager());
        try {
            JobRepository jobRepository = factoryBean.getObject();
            return jobRepository;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是当我的工作开始时,Spring Batch的第一件事就是在Oracle DB中创建表并继续使用Oracle数据源.这就像我的JobRepository定义没有被考虑在内.

我错过了什么 ?

编辑:我正在使用Spring Boot 1.5.3和Spring Batch 3.0.7

Chr*_*riX 9

使用 SpringBoot 2.x,解决方案更简单。

你必须DefaultBatchConfigurer像这样扩展这个类:

@Component
public class NoPersistenceBatchConfigurer extends DefaultBatchConfigurer {
    @Override
    public void setDataSource(DataSource dataSource) {
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有数据源,框架会自动切换到使用MapJobRepository.

  • 伟大的!它与应用程序类中的 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 一起使用 (3认同)

Mic*_*lla 7

这里有几件事:

  1. 如果您已经DataSource配置了ApplicationContext,默认情况下Spring Batch会尝试使用它.
  2. 为了不使用DataSource何时可用ApplicationContext,您需要创建自己的BatchConfigurer.你可以通过扩展DefaultBatchConfigurer.
  3. 不要MapJobRepository仅用于测试目的.我有许多问题(线程安全等),不建议用于生产.使用内存数据库(如HSQLDB)(您仍然需要创建自己的数据库BatchConfigurer).