我们使用 Spring Boot 1.5.10 和 Spring Data for Apache Cassandra这一切都运作良好。
我们有一个新的要求,我们需要在服务启动和运行时连接到不同的 key 空间。
通过使用Spring Cloud Config Server,我们可以很方便的设置spring.data.cassandra.keyspace-name
的值,但是不确定有没有办法可以动态切换(强制)服务以使用此新 key 空间,而无需先重新启动?
有什么想法或建议吗?
最佳答案
将 @RefreshScope
与属性/存储库一起使用不起作用,因为键空间绑定(bind)到 Cassandra Session
bean。
将 Spring Data Cassandra 1.5 与 Spring Boot 1.5 结合使用,您至少有两个选择:
- 声明一个
@RefreshScope
CassandraSessionFactoryBean
,另见CassandraDataAutoConfiguration
.这将在刷新时中断所有 Cassandra 操作并重新创建所有相关 bean。 监听
RefreshScopeRefreshedEvent
并通过USE my-new-keyspace;
更改键空间。这种方法侵入性较小,不会中断正在运行的查询。您基本上会使用事件监听器。@Component class MySessionRefresh { private final Session session; private final Environment environment; // omitted constructors for brevity @EventListener @Order(Ordered.LOWEST_PRECEDENCE) public void handle(RefreshScopeRefreshedEvent event) { String keyspace = environment.getProperty("spring.data.cassandra.keyspace-name"); session.execute("USE " + keyspace + ";"); } }
在 Spring Data Cassandra 2 中,我们引入了 SessionFactory
抽象提供 AbstractRoutingSessionFactory
用于 CQL/ session 调用的代码控制路由。
关于java - 如何动态设置 Spring Data Cassandra 键空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753874/