我正在尝试对我的应用程序做类似的事情。我正在使用以下版本的Spring boot和Cassandra:
Spring数据卡桑德拉-2.0。8.释放Spring护套启动器父级-2.0。4.RELEASE我需要动态更改Cassandra的一些属性(主要是主机名),并希望它与应用程序建立新的连接。对于配置更改,我们有内部云配置更改管理,它在更改时运行良好,并侦听更改。这是我的班级:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@RefreshScope
@EnableCassandraRepositories(basePackages = {"com.*.*.*.dao.repo"})
public class AppConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(AppConfig.class);
@Value("${application['cassandraPort']}")
private String cassandraPort;
@Value("${application['cassandraEndpoint']}")
private String cassandraEndpoint;
@Value("${application['keyspaceName']}")
private String keyspaceName;
@Value("${application['cassandraConsistency']}")
private String cassandraConsistency;
@Value("${application['cassandraUserName']}")
private String cassandraUserName;
@Autowired
private AppConfig appConfig;
public AppConfig() {
System.out.println("AppConfig Constructor");
}
public String getCassandraPort() {
return cassandraPort;
}
public void setCassandraPort(String cassandraPort) {
this.cassandraPort = cassandraPort;
}
public String getCassandraEndpoint() {
return cassandraEndpoint;
}
public void setCassandraEndpoint(String cassandraEndpoint) {
this.cassandraEndpoint = cassandraEndpoint;
}
public String getKeyspaceName() {
return keyspaceName;
}
public void setKeyspaceName(String keyspaceName) {
this.keyspaceName = keyspaceName;
}
public String getCassandraConsistency() {
return cassandraConsistency;
}
public void setCassandraConsistency(String cassandraConsistency) {
this.cassandraConsistency = cassandraConsistency;
}
public String getCassandraUserName() {
return cassandraUserName;
}
public void setCassandraUserName(String cassandraUserName) {
this.cassandraUserName = cassandraUserName;
}
@Bean
// @RefreshScope
public CassandraConverter converter() {
return new MappingCassandraConverter(this.mappingContext());
}
@Bean
// @RefreshScope
public CassandraMappingContext mappingContext() {
return new CassandraMappingContext();
}
@Bean
//@RefreshScope
public CassandraSessionFactoryBean session() {
CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
session.setCluster(this.cluster().getObject());
session.setKeyspaceName(appConfig.getKeyspaceName());
session.setConverter(this.converter());
session.setSchemaAction(SchemaAction.NONE);
return session;
}
@Bean
//@RefreshScope
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints(appConfig.getCassandraEndpoint());
cluster.setPort(Integer.valueOf(appConfig.getCassandraPort()));
cluster.setUsername(appConfig.getCassandraUserName());
cluster.setPassword("password");
cluster.setQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM));
return cluster;
}
}
但是,当我尝试将@RefreshScope与该配置类一起使用时,应用程序无法启动。这是它在控制台中显示的内容:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 2 of constructor in org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration required a bean of type 'com.datastax.driver.core.Cluster' that could not be found.
- Bean method 'cassandraCluster' not loaded because auto-configuration 'CassandraAutoConfiguration' was excluded
Action:
Consider revisiting the entries above or defining a bean of type 'com.datastax.driver.core.Cluster' in your configuration.
有没有一些关于使用@ReresScope与Cassandra Bean的指南?如果早些时候有人这样做了,你能分享吗?
你在这里混合了一些东西。
为了清理,我们将尽可能多地重用Spring Boot提供的内容,并且只声明真正需要的内容。
按照以下步骤解决问题(基于上述代码):
@ConfigurationProperties
bean,或者更好地重用CassandraProperties
。CassandraAutoConfiguration
并删除您自己的MappingContext
和CassandraConzer
bean,只保留Cluster
和会话
bean定义Cluster
和会话
bean,并使它们使用@ReresScope
。你的配置类应该看起来像:配置示例:
@Configuration
public class MyConfig {
@Bean(destroyMethod = "close")
@RefreshScope
public Cluster cassandraCluster(CassandraProperties properties) {
Cluster.Builder builder = Cluster.builder().addContactPoints(properties.getContactPoints().toArray(new String[0]))
.withoutJMXReporting();
return builder.build();
}
@Bean(destroyMethod = "close")
@RefreshScope
public Session cassandraSession(CassandraProperties properties, Cluster cluster) {
return cluster.connect(properties.getKeyspaceName());
}
}
问题内容: 我有一个Spring应用程序,我想动态更改数据源。当输入DS URL时,Spring Bean和所有依赖项将自动更新。我知道这有些奇怪,但是无论如何我都想实现。我的Spring配置如下: 问题是: JDBC URL存储在属性中,可以在运行时更改它。 更改URL后,我需要重新创建数据源,可能还需要重新创建相关对象。我不知道Spring如何优雅地做呢? 我知道Spring确实可以基于一个键
我有一个Spring应用程序,我想动态更改数据源,即。当输入DS URL时,Spring bean和所有依赖项将自动更新。我知道这有点奇怪,但无论如何我想实现这一点。我的Spring配置如下: 问题是: > 一旦URL被更改,我需要重新创建数据源,可能还有依赖对象。我不知道如何在Spring优雅地做这件事? 我知道Spring可以基于一个键动态路由数据源,但数据源URL是在Spring中预定义的,
V1.1.1新增 <?php $data=array("URL_HTML_SUFFIX"=>".html"); $result=sp_set_dynamic_config($data); ?>
一旦提交,配置服务器就在刷新endpoint发布更新后的值:http://localhost:8888/camelspringbootsample/dev 我还在http://localhost:8181/Actuator/env提供了Camel应用程序endpoint 在这里,属性的值不会在刷新时更新。但是,如果我重新启动Camel应用程序,则会反映出该值。 你能帮我做这个吗?提前谢了。
UPDATE命令用于更新Cassandra表中的数据。 如果在更新数据后看不到任何结果,则表示数据成功更新,否则将返回错误。 在更新Cassandra表中的数据时,通常使用以下关键字: :WHERE子句用于选择要更新的行。 :SET子句用于设置值。 :它用于包括构成主键的所有列。 语法: 又或者 - 注意:使用UPDATE命令并且给定的行可用时,UPDATE会创建一个新行。 示例: 我们举个例子来
我已经使用