当前位置: 首页 > 知识库问答 >
问题:

Spring数据Cassandra配置动态更改

晏永康
2023-03-14

我正在尝试对我的应用程序做类似的事情。我正在使用以下版本的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的指南?如果早些时候有人这样做了,你能分享吗?

共有1个答案

易祖鹤
2023-03-14

你在这里混合了一些东西。

  1. 配置包含属性和bean定义

为了清理,我们将尽可能多地重用Spring Boot提供的内容,并且只声明真正需要的内容。

按照以下步骤解决问题(基于上述代码):

  1. 创建一个封装属性的@ConfigurationPropertiesbean,或者更好地重用CassandraProperties
  2. 重新启用CassandraAutoConfiguration并删除您自己的MappingContextCassandraConzerbean,只保留Cluster会话bean定义
  3. 根据需要声明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); ?>

  • UPDATE命令用于更新Cassandra表中的数据。 如果在更新数据后看不到任何结果,则表示数据成功更新,否则将返回错误。 在更新Cassandra表中的数据时,通常使用以下关键字: :WHERE子句用于选择要更新的行。 :SET子句用于设置值。 :它用于包括构成主键的所有列。 语法: 又或者 - 注意:使用UPDATE命令并且给定的行可用时,UPDATE会创建一个新行。 示例: 我们举个例子来

  • 一旦提交,配置服务器就在刷新endpoint发布更新后的值:http://localhost:8888/camelspringbootsample/dev 我还在http://localhost:8181/Actuator/env提供了Camel应用程序endpoint 在这里,属性的值不会在刷新时更新。但是,如果我重新启动Camel应用程序,则会反映出该值。 你能帮我做这个吗?提前谢了。