Как взаимодействовать с несколькими пространствами ключей с реактивными репозиториями Cassandra в java Springboot WebFlux?

#java #cassandra #spring-webflux

#java #cassandra #spring-webflux

Вопрос:

Я пытаюсь подключиться к двум разным реактивным пространствам ключей в зависимости от входящего http-запроса. Запрос будет содержать некоторую информацию, которая предназначена для уровня бизнес-логики / сервиса для извлечения данных либо из пространства ключей A, либо из пространства ключей B (путем вызова ReactiveARepository или ReactiveBRepository), чтобы получить соответствующие данные.

Простой оператор if не является решением, поскольку он требует использования правильного реактивного репозитория с соответствующей реактивной конфигурацией, реактивным шаблоном и т. Д…

На уровне репозитория очень просто, даже без использования каких-либо пользовательских запросов. Я даже помещаю репозитории в их собственные соответствующие пакеты.

 package com.cassandra.repository.a;

@Repository
public interface ReactiveARepository extends ReactiveCassandraRepository<MyPojo, String> {

 
 package com.cassandra.repository.b;

@Repository
public interface ReactiveBRepository extends ReactiveCassandraRepository<MyPojo, String> {
 
 @Configuration
@EnableReactiveCassandraRepositories
public class AandBcommonCassandraConfiguration extends AbstractReactiveCassandraConfiguration {

//the @Value private String for contactPoints, keyspace, datacenter, port, username and password 

    @Bean
    @NonNull
    @Override
    public CqlSessionFactoryBean cassandraSession() {
        final CqlSessionFactoryBean cqlSessionFactoryBean = new CqlSessionFactoryBean();
        cqlSessionFactoryBean.setContactPoints(contactPoints);
        cqlSessionFactoryBean.setKeyspaceName(keyspace);
        cqlSessionFactoryBean.setLocalDatacenter(datacenter);
        cqlSessionFactoryBean.setPort(port);
        cqlSessionFactoryBean.setUsername(username);
        cqlSessionFactoryBean.setPassword(passPhrase);
        return cqlSessionFactoryBean;
    }

    @NonNull
    @Override
    protected String getKeyspaceName() {
        return keyspace;
    }

    @Override
    protected String getLocalDataCenter() {
        return datacenter;
    }

//other getters

 

Что я уже пробовал:

 @Configuration
@EnableReactiveCassandraRepositories(basePackages = "com.cassandra.repository.a”, reactiveCassandraTemplateRef = “keyspaceCassandraTemplateA”)
public class AkeyspaceCassandraConfiguration extends BaseCassandraConfiguration {

    @Value("${spring.data.cassandra.keyspace-name.keyspaceA}”)
    private String keyspace;

    @NonNull
    @Override
    public String getKeyspaceName() {
        return keyspace;
    }

    @NonNull
    @Override
    public CqlSessionFactoryBean cassandraSession() {
        final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession();
        cqlSessionFactoryBean.setKeyspaceName(keyspace);
        return cqlSessionFactoryBean;
    }

    @Bean(“keyspaceCassandraTemplateA”)
    public ReactiveCassandraTemplate reactiveCassandraTemplate() {
        final ReactiveSession reactiveSession = new DefaultBridgedReactiveSession(cassandraSession().getObject());
        return new ReactiveCassandraTemplate(reactiveSession);
    }
 
 @Configuration
@EnableReactiveCassandraRepositories(basePackages = "com.cassandra.repository.B”, reactiveCassandraTemplateRef = “keyspaceCassandraTemplateB”)
public class BKeyspaceCassandraConfiguration extends BaseCassandraConfiguration {

    @Value("${spring.data.cassandra.keyspace-name.keyspaceB}”)
    private String keyspace;

    @NonNull
    @Override
    public String getKeyspaceName() {
        return keyspace;
    }

    @NonNull
    @Override
    public CqlSessionFactoryBean cassandraSession() {
        final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession();
        cqlSessionFactoryBean.setKeyspaceName(keyspace);
        return cqlSessionFactoryBean;
    }

    @Bean("keyspaceCassandraTemplateB")
    public ReactiveCassandraTemplate reactiveCassandraTemplate() {
        final ReactiveSession reactiveSession = new DefaultBridgedReactiveSession(cassandraSession().getObject());
        return new ReactiveCassandraTemplate(reactiveSession);
    }
 

Однако он указывает только на пространство ключей A.
Могу ли я спросить, как правильно создать реактивное приложение с двумя пространствами ключей в Cassandra?

Комментарии:

1. У меня тоже такой же сценарий, смогли ли вы это решить. Пожалуйста, предоставьте некоторые идеи

Ответ №1:

Возможно, это не тот ответ, который вы ищете, но в Spring Data JPA вы можете добиться подключения к нескольким базам данных для разных наборов объектов, настроив отдельные компоненты EntityManagerFactory и PlatformTransactionManager для каждого источника данных.

Примеры

HTH!

Комментарии:

1. Спасибо за комментарий! Но это немного отличается с Cassandra, с реактивной и реактивной Кассандрой: p