繁体   English   中英

如何使用 SpringBoot 创建多个反应式 MongoDB 连接器

[英]How to create multiple reactive MongoDB connectors with SpringBoot

我有一个 SpringBoot 应用程序,它当前使用自动配置连接到 MongoDB。 我需要添加更多的 MongoDB 数据源。

我试图手动创建它们,但我很难找到正确的配置。

我发现Spring: 2 Repositories out of a single Entity and Multiple MongoDB connector with Spring Boot但底层类已过时并且抛出错误:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Timeout on blocking read for 5000000000 NANOSECONDS

Spring Boot 自动配置适用于一个数据源,但不支持多个连接器。

为此,我们必须手动创建 Repository 实例,但由于它们是从接口动态实现的,因此无法创建具体实例并添加参数。

脚步:

  1. 禁用 Mongo 的 Spring Auto 配置,以便我们可以手动提供 bean
  2. 为所需的每个连接器创建一个ReactiveMongoTemplate bean。 这将被 Spring 用来创建新的ReactiveRepositories实例
  3. 不同的兄弟包中创建ReactiveRepository实例。
  4. 最后为所需的每个连接器创建一个@Configuration并指定ReactiveRepository实例所在的包(参见下面的示例)

//# 1. Disable autoconfig
@SpringBootApplication(exclude = {
    MongoAutoConfiguration.class,
    MongoDataAutoConfiguration.class
})
public class XyzApplication {
...
}

//# 2. Create reactive template beans
package com.xyz.config;
...
@Configuration
public class MultipleMongoConfig {

    @Value("${mongodb.primary.uri}")
    private String mongodbPrimaryUri;

    @Value("${mongodb.readonly.uri}")
    private String mongodbSecondaryUri;

    @Primary
    @Bean
    public ReactiveMongoTemplate primaryMongoTemplate() {
        return new ReactiveMongoTemplate(
            new SimpleReactiveMongoDatabaseFactory(
                new ConnectionString(mongodbPrimaryUri)));
    }

    @Primary
    @Bean
    public ReactiveMongoTemplate secondaryMongoTemplate() {
        return new ReactiveMongoTemplate(
            new SimpleReactiveMongoDatabaseFactory(
                new ConnectionString(mongodbSecondaryUri)));
    }
}

步骤 1 和 2 将替换 Spring 自动配置。 然后 3 和 4 将使用此配置

//# 3. Create Reactive repositories
// PrimaryRepository.java
package com.xyz.primary;

@Repository
public interface PrimaryRepository extends ReactiveMongoRepository<Xyz, String> {}


// SecondaryRepository.java
pacakge com.xyz.secondary;

@Repository
public interface SecondaryRepository extends ReactiveMongoRepository<Xyz, String> {}

//# 4. Create specifig configs
// PrimaryMongoConfig.java
package com.xyz.config;
...
@Configuration
@EnableReactiveMongoRepositories(
    basePackages = "com.xyz.primary", 
    reactiveMongoTemplateRef = "primaryMongoTemplate")
public class PrimaryMongoConfig {}

// SecondaryMongoConfig.java
pacakge com.xyz.config;
...
@Configuration
@EnableReactiveMongoRepositories(
    basePackages = "com.xyz.secondary",
    reactiveMongoTemplateRef = "secondaryMongoTemplate")
public class SecondaryMongoConfig {}
      

笔记:

  • 存储库必须位于单独的兄弟包中(或至少确保一个不是另一个的子包)
  • 关键部分是指定创建存储库的basePackage
  • 因为它们位于不同的包中,所以存储库可以具有相同的名称,但如果两者都在同一个类中使用,则必须在代码中使用它们的完全限定名称。
  • 如果 spring-boot-data 依赖项已经存在,则提供所有类,如果您发现自己需要导入 mongodb 驱动程序,那么您就走错了路。
  • SimpleReactiveMongDatabaseFactory是使用连接字符串创建的,其中包括密码和数据库名称,您必须注意如何外部化此配置。 还有一个构造函数,但是我没有去尝试创建一个单独的 MongoClient 实例
  • 可以使用现有的spring.data.mondgodb.uri ,但我发现创建单独的属性更好:使用mongodb.primary.urimongodb.secondary.uri

资源:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM