在spring-boot-batch项目中,可以为jobrepository使用不同的数据源而不是项目阅读器吗?

时间:2017-04-18 12:38:23

标签: spring-boot spring-batch

使用spring-data-jpa设置我的第一个spring-boot-batch项目。我在我的开发环境中有一个工作解决方案,我在我的itemReader中从Oracle DB中消耗了一些行,在我的处理器中为每一行解析一些xml / html,然后使用自定义将每个提取的html写出到单个文件中itemWriter。 (每行1个文件)

我的数据源是通过引导项目中的spring-data-jpa配置的(application.properties)......

我注意到OOTB spring-batch使用可用的数据源为其jobRepository创建了各种模式对象。

这在开发环境中很好,但我只在我们的生产Oracle DB环境中拥有“读取”访问权限,我的itemReader将获取其官方数据。

我尝试配置2个数据源,如我遇到的春季文档中所述......但无法使其正常工作。我也试过在内存中使用,但也无法使用。

这可能吗?或者我应该继续关注内存中的作业回购工作吗?

此时我并不太关心可重启性。批处理作业将作为独立的spring-boot应用程序在我的桌面上运行。

非常感谢任何帮助,提示,信息。

更新

尝试内存配置,这是我的批量配置类的一部分:

   @Configuration
@EnableBatchProcessing
public class BatchConfiguration {


    private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);


    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    EntityManagerFactory emf;

    @Bean
    public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
        SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(jobRepository);
        return simpleJobLauncher;
    }

    @Bean
    public JobRepository jobRepository(ResourcelessTransactionManager transactionManager) throws Exception {
        MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager);
        mapJobRepositoryFactoryBean.setTransactionManager(transactionManager);
        return mapJobRepositoryFactoryBean.getObject();
    }

    @Bean
    public ResourcelessTransactionManager transactionManager() {
        return new ResourcelessTransactionManager();
    }

项目编译正常,但是当我运行时,我得到以下内容:

引起:org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[SELECT JOB_INSTANCE_ID,来自BATCH_JOB_INSTANCE的JOB_NAME = JOB_NAME =?按JOB_INSTANCE_ID desc]排序;嵌套异常是java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在

所以它似乎还在尝试与Oracle连接,而不是使用内存数据库..

1 个答案:

答案 0 :(得分:1)

好吧......似乎这个配置已经完成了我的案例。

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


    private static final Logger log = LoggerFactory.getLogger(BatchConfiguration.class);


    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    EntityManagerFactory emf;

    @Bean
    public SimpleJobLauncher jobLauncher(JobRepository jobRepository) throws Exception {
        SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(jobRepository);
        simpleJobLauncher.afterPropertiesSet();
        return simpleJobLauncher;
    }

    @Bean
    public MapJobRepositoryFactoryBean mapJobRepositoryFactory(ResourcelessTransactionManager txManager)
            throws Exception {
        MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager);
        factory.afterPropertiesSet();
        return factory;
    }

    @Bean
    public JobRepository jobRepository(MapJobRepositoryFactoryBean factory) throws Exception {
         return factory.getObject();
    }

    @Bean
    public ResourcelessTransactionManager  resourcelessTransactionManager() {
        return new ResourcelessTransactionManager();
    }

    @Bean
    public JobExplorer jobExplorer(MapJobRepositoryFactoryBean factory) {
        return new SimpleJobExplorer(factory.getJobInstanceDao(), factory.getJobExecutionDao(),
                factory.getStepExecutionDao(), factory.getExecutionContextDao());
    }