如何在 java Springboot WebFlux 中使用反应式 Cassandra 存储库与多个键空间交互?

5 java cassandra spring-webflux

我正在尝试根据传入的 http 请求连接到两个不同的反应键空间。该请求将包含一些信息,用于业务逻辑/服务层从键空间 A 或键空间 B(通过调用 ReactiveARepository 或 ReactiveBRepository)检索数据,以获取相应的数据。

简单的 if 语句不是解决方案,因为它需要使用正确的反应式存储库以及相应的反应式配置、反应式模板等……

在存储库层,非常简单,甚至不使用任何自定义查询。我什至将存储库放在各自的包中。

package com.cassandra.repository.a;

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

Run Code Online (Sandbox Code Playgroud)
package com.cassandra.repository.b;

@Repository
public interface ReactiveBRepository extends ReactiveCassandraRepository<MyPojo, String> {
Run Code Online (Sandbox Code Playgroud)
@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

Run Code Online (Sandbox Code Playgroud)

我已经尝试过的:

@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);
    }
Run Code Online (Sandbox Code Playgroud)
@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);
    }
Run Code Online (Sandbox Code Playgroud)

但是,它仅指向键空间 A。请问在 Cassandra 中使用两个键空间的反应式应用程序的正确方法是什么?

san*_*ian 1

这可能不是您正在寻找的答案,但在 Spring Data JPA 中,您可以通过为每个数据源配置单独的 EntityManagerFactory 和 PlatformTransactionManager bean 来实现连接到不同实体集的多个数据库。

例子

哈!