#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