首页 > 解决方案 > Spring Boot Cassandra 连接到节点时出错(endPoint=localhost:1234,hostId=null,hashCode=37hfeouh3),

问题描述

在我的 Spring Boot Cassandra 构建中,我收到以下错误:s0-admin-1] cdodiccontrol.ControlConnection:[s0] 连接到节点时出错(endPoint=localhost:1234,hostId=null,hashCode=37hfeouh3),尝试下一个节点( ConnectionInitException: [s0|control|connecting...] 协议初始化请求,步骤 1 (OPTIONS): 发送请求失败 (io.netty.channel.StacklessClosedChannelException))

实体类型

@Data
@Builder
@Table
public class Class1 {
    @Id
    private String id;
    private String data;
    private Class2 data2;
    private Integer data3;
    ...
}
public class2 Class2 {
    @Id
    @JasonProperty
    private String id;
    @Indexed
    @JasonProperty
    private String data;
@JasonProperty
    private String data2;
@JasonProperty
    private Integer data3;
    ...
}
@Configuration
@EnableCassandraRepositories
@ConfigurationProperties(prefix = "DBProperties")
public class ApplicationConfig extends AbstractCassandraConfiguration {

    private String DBKEYSPACE;

    @Override
    protected String getKeyspaceName() {
        return DBKEYSPACE;
    }

    public String[] getEntityBasePackages() {
        return new String[] { "com.oreilly.springdata.cassandra" };
    }
}
@ConfigurationProperties(prefix = "DBPROPERTIES")
@Slf4j
public class FactoryBeanAppConfig {

    private String contactPoints;
    private String keySpace;
    private Integer port;
    private String password;
    private String username;
    private String dataCenter;

    /*
     * Factory bean that creates the com.datastax.oss.driver.api.core.CqlSession instance
     */

    @Bean
    public CqlSessionFactoryBean session() {

        //log it we made it.
        log.info("I made it to CqlSessionFactoryBean");
        CqlSessionFactoryBean session = new CqlSessionFactoryBean();
        session.setContactPoints(URLINFO);
        log.info("Contact Points: " +URLINFO);
        session.setKeyspaceName(DBKEYSPACE);
        //session.setPort(OURPORT);
        session.setUsername(username);
        session.setPassword(password);
        session.setLocalDatacenter(LOCALDCENTER INFORMATION);

        return session;
    }
}

我找不到一个很好的例子,甚至无法让它正常工作。查看此文档:https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.core这是实现示例 55 我唯一要做的事情

标签: spring-dataspring-data-cassandra

解决方案


对于 Spring Boot 运行您的应用程序,它需要在您的服务器应用程序(例如 tomcat)启动时加载数据库。因此,应首先创建您的架构。如果没问题,您可以在 cassandra.yaml 文件中将“localhost”更改为“127.0.0.1”。

重要提示:[s0] Error connected to Node(endPoint=localhost: 1234 ,... ” 请检查 cassandra 的端口。正确的是 9042。

它会解决你的问题。但是,可能会发生其他错误,因为其他类。

然后,您可以更正以下类:

@SpringBootApplication
@EnableCassandraRepositories(basePackages = { "<package's path>" })
@EntityScan(basePackages = { "<package's path>" })
@ComponentScan(basePackages = { "<package's path>" })
public class ApplicationConfig extends SpringBootServletInitializer 
{
        SpringApplication.run(ApplicationConfig.class, args);
}

实体:

@Table("<table name>")
public class Class1 {
    @PrimaryKeyColumn(name = "<field name id>", type = PrimaryKeyType.PARTITIONED)
    private String id;
    @Column("<field name data>")
    private String data;
    private Class2 data2; //I think this declaretion can cause error
    @Column("<field name data3>")
    private Integer data3;
    ...
}

这个 FactoryBeanAppConfig 的类听起来不太好。我创建了一个类来读取 application.properties 并注入这个类来连接数据库数据,如键空间的名称、端口等。此链接将帮助您创建此类:https ://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config 。然后,您在 FactoryBeanAppConfig 的类中使用这个类来获取 DBKEYSPACE、OURPORT、...。

这是一个帮助您理解我在说什么的示例:https ://www.baeldung.com/spring-data-cassandra-tutorial 。


推荐阅读