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】:仅将 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 使用特定的数据源。这是我的主要目标。我有两个,它总是捡错一个。以上是关于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核心原理剖析》