【问题标题】:Spring Reactive Cassandra, use custom CqlSessionSpring Reactive Cassandra,使用自定义 CqlSession
【发布时间】:2020-12-29 04:49:34
【问题描述】:

我们如何在 Spring Webflux 应用程序上使用自定义 CqlSession 并结合 Spring starter 反应式 Cassandra?

我目前正在执行以下操作,效果很好:

public class BaseCassandraConfiguration extends AbstractReactiveCassandraConfiguration {



    @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;
    }

但是,我想使用自定义会话,例如:

        CqlSession session = CqlSession.builder().build();

我们如何告诉这个配置使用它?

谢谢

【问题讨论】:

  • 默认情况下,您只需要一个使用最新版本 spring 的会话,因为它将根据您的应用程序的需要创建新会话。您想要不同的会话配置做什么?
  • @KenRabe 谢谢你的回答。我需要这个:CqlSession.builder().withClientId(MyClientId),请问我该怎么做?

标签: cassandra spring-webflux spring-data-cassandra


【解决方案1】:

选项 1:

如果您希望完全覆盖自动配置的 CqlSession bean,您可以通过提供自己的 CqlSesson bean 来实现。

@Bean
public CqlSession cassandraSession() {
    return CqlSession.builder().withClientId(MyClientId).build();
}

覆盖整个 bean 的缺点是您将失去通过应用程序属性配置此会话的能力,并且您将失去 Spring Boot 附带的默认值。

选项 2:

如果您想保留 Spring Boot 提供的默认值并能够通过应用程序属性配置会话,您可以使用 CqlSessionBuilderCustomizerCqlSession 提供特定的自定义配置。这可以通过定义该类型的 bean 来实现,即:

@Bean
public CqlSessionBuilderCustomizer myCustomiser() {
    return cqlSessionBuilder -> cqlSessionBuilder.withClientId(MyClientId);;
}

我个人的偏好是选项 2,因为它保留了 spring boot 提供的功能,我认为随着时间的推移会更容易维护应用程序。

【讨论】:

  • 感谢您的回答迈克尔。我也倾向于您的选项 2,因为我确实想通过 application.properties 保留 Spring 配置。我想出了以下代码,但它似乎不起作用。请问这个CqlSessionBuilderCustomizer怎么用?
  • @Value("${spring.data.cassandra.username}") 私有字符串用户名; @Value("${spring.data.cassandra.password}") 私有字符串密码; @Value("${spring.data.cassandra.keyspace-name}") 私有字符串键空间; @Value("${spring.data.cassandra.datacenter}") 私有字符串数据中心; @Value("${spring.data.cassandra.contact-points}") 私有字符串contactPoints; @Value("${spring.data.cassandra.port}") 私有 int 端口;
  • ``` @Bean @NonNull public CqlSessionBuilderCustomizer cqlSessionBuilderCustomizer() { return cqlSessionBuilder -> cqlSessionBuilder.withClientId(UUID.fromString("9509d9a6-bc0f-44a3-b8d0-900fdfce8c90")); } ```
  • ``` @Bean @NonNull @Override public CqlSessionFactoryBean cassandraSession() { final CqlSessionFactoryBean cqlSessionFactoryBean = new CqlSessionFactoryBean(); cqlSessionFactoryBean.setContactPoints(contactPoints); cqlSessionFactoryBean.setKeyspaceName(keyspace); cqlSessionFactoryBean.setLocalDatacenter(datacenter); cqlSessionFactoryBean.setPort(端口); cqlSessionFactoryBean.setUsername(用户名); cqlSessionFactoryBean.setPassword(passPhrase);返回 cqlSessionFactoryBean; } ```
  • 啊,所以问题是UUID.randomUUID() 是从 /dev/random 读取的阻塞操作。由于这是在启动时完成一次而不是作为 API 调用的一部分,因此我建议此阻塞操作不会在您的应用中导致任何问题,并且可能会添加到 blockhound 中可忽略的阻塞操作列表中。
猜你喜欢
  • 2019-04-11
  • 2021-02-25
  • 1970-01-01
  • 2020-09-28
  • 2020-12-20
  • 1970-01-01
  • 2019-06-05
  • 2016-12-16
  • 2022-11-18
相关资源
最近更新 更多