java - java - 如何使用Java Springboot WebFlux中的反应式Cassandra存储库与多个键空间进行交互?
问题描述
我正在尝试根据传入的 http 请求连接到两个不同的反应键空间。该请求将包含一些信息,这些信息用于业务逻辑/服务层从键空间 A 或键空间 B(通过调用 ReactiveARepository 或 ReactiveBRepository)检索数据以获取相应的数据。
一个简单的 if 语句不是解决方案,因为它需要使用正确的响应式存储库以及相应的响应式配置、响应式模板等……</p>
在存储库层,非常简单,甚至不使用任何自定义查询。我什至将存储库放到了它们各自的包中。
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 中具有两个键空间的反应式应用程序的正确方法是什么?
解决方案
这可能不是您要寻找的答案,但是在 Spring Data JPA 中,您可以通过为每个数据源配置单独的 EntityManagerFactory 和 PlatformTransactionManager bean 来实现为不同的实体集连接到多个数据库。
!
推荐阅读
- selenium - 与硒框架相关的问题苦苦挣扎
- quickblox - iOS 中的 Quickblox 视频通话会话创建
- docker - 如何使用 sdk 连接到 windows 上的 containerd?
- python - 使用 pyodbc 从 SQL Server 读取数据到 pandas
- javascript - 激活 d4 功能时冻结
- db2 - Db2 on Cloud:法语界面中的密码和 ID 创建问题
- javascript - 无法在表单提交时使用 Formik 执行 React 状态更新
- revit-api - 具有用于导出/导入同步的类型的隐藏 ID
- charts - 如何查找上周一的柱数?交易观点
- javascript - 我希望当对象悬停时,应该运行一个 JS 函数,但它会在页面加载时立即运行