【问题标题】:Spring Boot + Spring Batch + HSQLDB -> Configure HSQLDB for JobRepositorySpring Boot + Spring Batch + HSQLDB -> 为 JobRepository 配置 HSQLDB
【发布时间】: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,这是错误的。我是否错误地初始化和设置了此数据类型的配置?

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

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

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

    @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 使用特定的数据源。这是我的主要目标。我有两个,它总是捡错一个。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2018-01-17
    • 2017-03-24
    • 2014-12-27
    相关资源
    最近更新 更多