当前位置: 首页 > 知识库问答 >
问题:

Spring Batch不使用自定义数据源创建表

斜高翰
2023-03-14

我正在使用运行批处理作业的REST-service(使用Spring Boot)。我希望Batch仅适用于嵌入式数据源(存储元数据),而默认数据源(在我的例子中为Postgres)将用于存储业务实体。

问题是Batch试图在启动时在默认数据源中创建元数据表(如batch_job_execution、batch_job_instance等)。

以下是重现问题的示例配置:

批量配置

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }
}

数据源配置

@Configuration
public class DataSourceConfiguration {
    @Bean
    @Primary
    public DataSource DataSource() {
        final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(org.postgresql.Driver.class);
        dataSource.setUrl("jdbc:postgresql://localhost:5432/test_batch");
        dataSource.setUsername("user");
        dataSource.setPassword("password");

        return dataSource;
    }

    @Bean(name = "batchDataSource")
    public DataSource batchDataSource() {
        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    }
}

通过这种配置,当microservice启动时,我会在Postgres中获得批处理表,尽管在软件之后,似乎使用了嵌入式数据源,因为在尝试启动作业时,我会收到H2的“Table not found”错误。

那么,我应该如何正确地编写配置,使批处理只与嵌入式数据源一起工作呢?我不希望主数据源中有任何元数据(甚至是空表)。

更新:

正如迈克尔·米内拉(Michael Minella)所说,应该再添加一个bean:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }

    @Bean
    public BatchDatabaseInitializer   batchDatabaseInitializer(@Qualifier("batchDataSource") DataSource dataSource, ResourceLoader resourceLoader){
        BatchDatabaseInitializer batchDatabaseInitializer = new     BatchDatabaseInitializer(dataSource, resourceLoader, new BatchProperties());
        return batchDatabaseInitializer;
    }
}

共有1个答案

满伟彦
2023-03-14

不幸的是,使用Spring Boot时,BatchDataSourceInitializer使用的数据源与BatchConfigurer无关。它只是在上下文中获取默认的数据源。如果您配置了自己的BatchDataSourceInitializer,则启动程序不会启动,您可以定义直接使用哪个DataSource

 类似资料:
  • 我正在使用运行批处理作业的REST-service(使用Spring Boot)。我希望Batch仅适用于嵌入式数据源(存储元数据),而默认数据源(在我的例子中为Postgres)将用于存储业务实体。 问题是Batch试图在启动时在默认数据源中创建元数据表(如batch_job_execution、batch_job_instance等)。 以下是重现问题的示例配置: 批量配置 数据源配置 通过这

  • 我正在尝试为PGInterval和Duration编写一个自定义数据类型绑定,以将jOOQ与TimescaleDB一起使用。遗憾的是,jOOQ在为数据库例程生成函数时没有使用它。 这是我的绑定类: 这是我在pom中的配置: 例如,我希望jOOQ生成例程 像 但是我得到了

  • 我正在连接Azure SQL数据库,下一个任务是在连接失败时创建自定义重试逻辑。我希望重试逻辑在启动时(如果需要)以及应用程序运行时出现连接故障时都能运行。我做了一个测试,从我的应用程序中删除了IP限制,然后导致我的应用程序出现异常(例外)。我想处理引发异常的时间,以便触发一个作业,验证应用程序和服务器是否正确配置。我正在寻找一个解决方案,在那里我可以处理这些异常并重试DB事务? 数据源配置 应用

  • 该到你发挥创意的时间了。你已经知道了各种不同的 Puppet 资源类型: 包(package), 文件(file)、用户(user),等等。 通常情况下,你既可以组合使用这些内置资源类型做你需要做的一切, 又可以通过一个自定义 define 作为一种资源(以内置资源同样的方式)来使用 (参见第 4 章 书写更优质的配置清单 中有关 define 的内容)。 但是,如果你需要创建自己的资源类型,Pu

  • 问题内容: 我想问一个与这个问题相同的问题,但使用SWT:是否有一种方法可以制作带有您自己的按钮图形的按钮,而不仅仅是按钮内的图像?如果不是,这是在Java中创建自定义按钮的另一种方法吗? 问题答案: public class ImageButton extends Canvas { private int mouse = 0; private boolean hit = false;

  • 基本上,我想知道我是否可以创建一个树并在JavaFX上自定义它...我试着去做,但到目前为止还不能用这个代码做任何事情... 我在质疑自己,这是否是正确的“技术”,可以解决我想做的事情... 我从https://docs.oracle.com/javafx/2/ui_controls/tree-view.htm#babjgggf看到了这个教程,但我对这个教程真的很困惑...我不太了解细胞工厂的机制