Spring Boot + Spring Batch + HSQLDB -> 为 JobRepository 配置 HSQLDB

Posted

技术标签:

【中文标题】Spring Boot + Spring Batch + HSQLDB -> 为 JobRepository 配置 HSQLDB【英文标题】:Spring Boot + Spring Batch + HSQLDB -> Configure HSQLDB for JobRepository 【发布时间】:2021-09-08 10:38:42 【问题描述】:

我是 Spring Boot 的新手。我正在尝试编写一个利用 Spring Batch 将数据从一个数据库写入另一个数据库的应用程序。我正在阅读 Mongo 并写入 SQL Server。我将我的 JobRepository 托管在内存中,并将其编码为使用 HSQLDB。

我在将 Spring.Batch 指向正确的数据源时遇到了一些问题,因此我现在专注于确保将我的作业写入 HSQLDB。为此,我现在基本上已经注释掉了 SQL DB。

我有以下 BatchConfiguration 类:

@Configuration
@EnableBatchProcessing
public class BatchConfigurer extends DefaultBatchConfigurer 

    @Autowired
    @Qualifier("batchDataSource")
    public DataSource batchDataSource;

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource)
        return new JdbcTemplate(dataSource);
    


    @Bean
    public JdbcTransactionManager batchTransactionManager() 
        final JdbcTransactionManager transactionManager = new JdbcTransactionManager();
        transactionManager.setDataSource(batchDataSource);
        return transactionManager;
    


    @Bean
    public JobRepository jobRepositoryBean() throws Exception 
        JobRepositoryFactoryBean fb = new JobRepositoryFactoryBean();
        fb.setDatabaseType("HSQL");
        fb.setDataSource(batchDataSource);
        fb.setTransactionManager(batchTransactionManager());
        return fb.getObject();
    


    @Override
    @Bean
    protected JobLauncher createJobLauncher() throws Exception 
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(this.jobRepositoryBean());
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        jobLauncher.afterPropertiesSet();
        return jobLauncher;
    


当我加载这个类时,我在日志中看到以下输出:

2021-06-24 17:18:42.412 WARN 31940 --- [main] o.s.b.c.c.a.DefaultBatchConfigurer:没有提供事务管理器,使用 DataSourceTransactionManager

2021-06-24 17:18:42.419 INFO 31940 --- [main] o.s.b.c.r.s.JobRepositoryFactoryBean :未设置数据库类型,使用元数据指示:HSQL

2021-06-24 17:18:43.154 WARN 31940 --- [main] JpaBaseConfiguration$JpaWebConfiguration:spring.jpa.open-in-view 默认启用。因此,可以在视图渲染期间执行数据库查询。显式配置 spring.jpa.open-in-view 以禁用此警告

我试图理解为什么会推断出数据库类型。看来我已经在设置它了。此外,当我取消注释其他数据源时,推断的类型是 SQLSERVER,这是错误的。我是否错误地初始化和设置了此数据类型的配置?

我想在再次处理多个数据源的情况之前,我会尝试让它正常工作。

【问题讨论】:

【参考方案1】:

仅将 TransactionManagerJobRepository 声明为 bean 是不够的,Spring Batch 不会将其考虑在内。您需要为此提供BatchConfigurer。由于您使配置类扩展 DefaultBatchConfigurer,因此您可以覆盖 getTransactionManagergetJobRepository,如下所示:

@Configuration
@EnableBatchProcessing
public class BatchConfigurer extends DefaultBatchConfigurer 

    @Autowired
    @Qualifier("batchDataSource") // ensure this is the HSQLDB here
    public DataSource batchDataSource;


    @Override
    public JdbcTransactionManager getTransactionManager() 
        final JdbcTransactionManager transactionManager = new JdbcTransactionManager();
        transactionManager.setDataSource(batchDataSource);
        return transactionManager;
    


    @Override
    public JobRepository getJobRepository() throws Exception 
        JobRepositoryFactoryBean fb = new JobRepositoryFactoryBean();
        fb.setDatabaseType("HSQL");
        fb.setDataSource(batchDataSource);
        fb.setTransactionManager(getTransactionManager());
        return fb.getObject();
    


    @Override
    public JobLauncher getJobLauncher() throws Exception 
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(this.jobRepositoryBean());
        jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
        jobLauncher.afterPropertiesSet();
        return jobLauncher;
    


这在此处的参考文档中有说明:Java Config。

【讨论】:

知道了。感谢您的澄清。我在使用您建议的代码时遇到的一个问题是: java: getJobRepository() in com.test.config.BatchConfigurer cannot override getJobRepository() in org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer overridden method does not throw java .lang.Exception 是的,您明白了,因此您可以根据需要调整代码。我相应地更新了答案。 嗯......这并不能解决问题 - 它实际上是在 getJobRepository 方法中。我正在努力做到这一点,以便将来有人可以使用此代码片段。我最终使用了覆盖 createJobLauncher() - 那会做同样的事情吗? 由于您没有提供完整的最小示例,因此我没有编译该代码,因此请相应地进行调整。它的工作方式是,如果您想提供自定义作业存储库(基于您的 HSQLDB),您需要通过BatchConfigurer#getJobRepository 来完成。我会让你检查异常处理。 好的 - 我真正想做的就是让 Batch 使用特定的数据源。这是我的主要目标。我有两个,它总是捡错一个。

以上是关于Spring Boot + Spring Batch + HSQLDB -> 为 JobRepository 配置 HSQLDB的主要内容,如果未能解决你的问题,请参考以下文章

将已有的spring app迁移到spring-boot,手动配置spring-boot?

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot

Spring Boot:Spring Boot启动原理分析