Spring data mongoDB ленивая конфигурация подключения к базе данных - PullRequest
0 голосов
/ 26 октября 2018

У меня мультитенантное приложение mongoDB, и давайте предположим, что правильное подключение к нужной базе данных выбирается из имени арендатора из заголовка HTTP-запроса (я использую ранее подготовленный файл свойств с именем арендатора). Когда приложение запускается, mongoDB настраивается, и у меня нет информации об арендаторе, потому что ни один запрос к приложению не был отправлен, поэтому я не знаю, к какой базе данных мне следует подключаться. Есть ли вероятность того, что соединение mongoDB с базой данных будет настроено динамически, когда я пытаюсь получить некоторые данные из хранилища mongo (тогда у меня есть имя арендатора из HTTP-запроса)?

MongoDbConfiguration:

@Configuration
public class MongoDbConfiguration {

    private final MongoConnector mongoConnector;

    @Autowired
    public MongoDbConfiguration(MongoConnector mongoConnector) {
        this.mongoConnector = mongoConnector;
    }

    @Bean
    public MongoDbFactory mongoDbFactory() {
        return new MultiTenantSingleMongoDbFactory(mongoConnector, new MongoExceptionTranslator());
    }

    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoDbFactory());
    }
}

1 Ответ

0 голосов
/ 27 октября 2018
@Component
@Slf4j
public class MultiTenantMongoDbFactory extends SimpleMongoDbFactory {

  private static final Logger logger = LoggerFactory.getLogger(MultiTenantMongoDbFactory.class);

  private Map<String, DbConfig> tenantToDbConfig;

  private Map<String, MongoDatabase> tenantToMongoDatabase;

  @Autowired
  public MultiTenantMongoDbFactory(
      final @Qualifier("sibTenantContexts") Map<String, DbConfig> dbConfigs,
      final SibEnvironment env) {

    super(new MongoClientURI(env.getDefaultDatabase()));
    this.tenantToDbConfig = dbConfigs;
    // Initialize tenantToMongoDatabase map.
    buildTenantDbs();
  }

  @Override
  public MongoDatabase getDb() {

    String tenantId = (!StringUtils.isEmpty(TenantContext.getId()) ? TenantContext.getId()
        : SibConstant.DEFAULT_TENANT);
    return this.tenantToMongoDatabase.get(tenantId);
  }

  /**
   * Create tenantToMongoDatabase map.
   */
  @SuppressWarnings("resource")
  private void buildTenantDbs() {

    log.debug("Building tenantDB configuration.");
    this.tenantToMongoDatabase = new HashMap<>();
    /*
     * for each tenant fetch dbConfig and intitialize MongoClient and set it to
     * tenantToMongoDatabase
     */
    for (Entry<String, DbConfig> idToDbconfig : this.tenantToDbConfig.entrySet()) {
      try {
        this.tenantToMongoDatabase.put(idToDbconfig.getKey(),
            new MongoClient(new MongoClientURI(idToDbconfig.getValue()
                .getUri())).getDatabase(idToDbconfig.getValue()
                    .getDatabase()));
      } catch (MongoException e) {
        log.error(e.getMessage(), e.getCause());
      }
    }
  }
}

В этом tenantToDbConfig - это компонент, который я создал во время загрузки приложения, где я сохраняю DBConfiguration (Url / имя базы данных) для каждого клиента.Существует одна база данных по умолчанию, которая требуется во время загрузки, и для каждого запроса я ожидаю tenantId в заголовке запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...