定义内存中的JobRepository

时间:2017-05-29 08:48:00

标签: spring-boot spring-batch

我正在使用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;
        }
    }

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

我错过了什么?

编辑:我使用的是Spring Boot 1.5.3和Spring Batch 3.0.7

4 个答案:

答案 0 :(得分:7)

这里有一些事情:

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

答案 1 :(得分:4)

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

您必须像这样扩展DefaultBatchConfigurer类:

@Component
public class NoPersistenceBatchConfigurer extends DefaultBatchConfigurer {
    @Override
    public void setDataSource(DataSource dataSource) {
    }
}

在没有数据源的情况下,框架会自动切换为使用MapJobRepository

答案 2 :(得分:3)

感谢pvpkiran的评论我发现了我的问题。定义JobLauncher 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;
    }
}

@Bean
public JobLauncher jobLauncher(JobRepository jobRepository) {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);

    return jobLauncher;
}

答案 3 :(得分:0)

如果使用Spring Boot和@EnableBatchProcessing,则将扩展DefaultBatchConfigurer并覆盖createJobRepository方法。使用MapJobRepositoryFactoryBean创建ResourcelessTransactionManager和JobRepository,其余的bean将由Spring Boot自动创建。

@Configuration
public class InMemoryBatchContextConfigurer extends DefaultBatchConfigurer {
    @Bean
    private ResourcelessTransactionManager resoucelessTransactionManager() {
        return new ResourcelessTransactionManager();
    }

    @Override
    protected JobRepository createJobRepository() throws Exception {
        MapJobRepositoryFactoryBean factoryBean = new MapJobRepositoryFactoryBean();
        factoryBean.setTransactionManager(resoucelessTransactionManager());
        return factoryBean.getObject();
    }
}`