代码之家  ›  专栏  ›  技术社区  ›  Balaji4you

Java应用程序无法使用提供的联系点连接到Cassandra集群

  •  0
  • Balaji4you  · 技术社区  · 3 年前

    错误如下:

    ERROR 1912 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: com/datastax/oss/protocol/internal/SegmentCodec] with root cause
    
    java.lang.ClassNotFoundException: com.datastax.oss.protocol.internal.SegmentCodec
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_251]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_251]
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_251]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_251]
        at com.datastax.oss.driver.internal.core.context.DefaultDriverContext.<init>(DefaultDriverContext.java:170) ~[java-driver-core-shaded-4.13.0.jar:na]
        at com.datastax.oss.driver.api.core.session.SessionBuilder.buildContext(SessionBuilder.java:968) ~[java-driver-core-shaded-4.13.0.jar:na]
    

    代码如下:

    public List<String> getCassandraTables(String cassandraHost,String cassandraUsername,String cassandraPassword,String datacenter,String cassandraKeyspace){
          try{
                
            InetSocketAddress address = new InetSocketAddress(cassandraHost,9042);
    
            DriverConfigLoader loader = DriverConfigLoader.programmaticBuilder()
            .withString(DefaultDriverOption.AUTH_PROVIDER_USER_NAME,cassandraUsername)
            .withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD,cassandraPassword).build();
    
            CqlSession builder = CqlSession.builder()
            .addContactPoint(address)
            .withConfigLoader(loader)
            .withKeyspace(cassandraKeyspace)
            .withLocalDatacenter(datacenter)
            .build();
    
            Metadata metadata = builder.getMetadata();
            KeyspaceMetadata keyspaceMetadata = metadata.getKeyspace(cassandraKeyspace)
            .orElseThrow(() -> new RuntimeException("Keyspace not found: " + cassandraKeyspace));
            List<String> tableNames = keyspaceMetadata.getTables().values().stream()
            .map(table->table.getName().toString()).collect(Collectors.toList());
    
            return tableNames;
            
            } catch(Exception e) {
                System.out.println("Failed to get tables from the Cassandra cluster: "+e.getMessage());
            return null;
         }
    }
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   Erick Ramirez    3 年前

    从你的帖子中还不清楚:

    • 您配置为 cassandraHost
    • 完整错误消息+完整堆栈跟踪是什么。

    然而,如果这是你在 Unable to connect to cluster from Spring Boot app, getting ConnectionInitException: "Could not reach any contact point" ,那么我认为问题是您将错误的主机指定为 localhost 而不是Cassandra用来监听客户端连接的IP地址。您应该使用与配置的地址相同的地址 rpc_address 在里面 cassandra.yaml 干杯