来自Java的Datastax Cassandra SSL连接错误NoHostAvailableException

来自Java的Datastax Cassandra SSL连接错误NoHostAvailableException,java,ssl,cassandra,datastax,datastax-java-driver,Java,Ssl,Cassandra,Datastax,Datastax Java Driver,我已经阅读并尝试了许多关于这个问题的解决方案,但它仍然不适合我。我得到以下例外情况: 线程“main”com.datasax.driver.core.exceptions.NoHostAvailableException中的异常:尝试查询的所有主机均失败(尝试:/1.2.3.4:9042(com.datasax.driver.core.exceptions.TransportException:[/1.2.3.4:9042]通道已关闭)) 我已将驱动程序更新为最新版本。 Cassandra.ya

我已经阅读并尝试了许多关于这个问题的解决方案,但它仍然不适合我。我得到以下例外情况:

线程“main”com.datasax.driver.core.exceptions.NoHostAvailableException中的异常:尝试查询的所有主机均失败(尝试:/1.2.3.4:9042(com.datasax.driver.core.exceptions.TransportException:[/1.2.3.4:9042]通道已关闭))

我已将驱动程序更新为最新版本。 Cassandra.yaml配置如下:

启动本地传输:真
本地\u传输\u端口:9042
rpc_地址:0.0.0.0

我可以从Datastax DevCenter连接到节点,但不能从Java连接到节点。我不确定问题出在哪里

这是我在Java中使用的代码

public class ClientToNodeConnection {

  public static Logger logger = 
LoggerFactory.getLogger(ClientToNodeConnection.class);

  public static void main(String[] args) {

    ClientToNodeConnection l = new ClientToNodeConnection();

    l.execute();
  }

  private void execute() {
    Cluster cluster;
    Session session;

    logger.info("Login into {}");

    cluster = getCluster("/client-keystore.jks", "keypass", "1.2.3.4");

    // Connect to the cluster and keyspace "ssl"
    session = cluster.newSession();

    session.execute(" CREATE KEYSPACE IF NOT EXISTS ssl WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};");


    session.execute("use ssl;");
    session.execute("CREATE TABLE IF NOT EXISTS songs (title text, lyrics text, PRIMARY KEY (title))");

    // Insert one record into the users table
    session.execute("INSERT INTO songs (title, lyrics) VALUES ('Don''t believe the hype', 'Caught you lookin for the same thing It''s a new thing check out this I bring')");

    // Use select to get the user we just entered
    ResultSet results = session.execute("SELECT * FROM songs Limit 200;");
    for (Row row : results) {
      logger.info("*** data extracted ***");
      logger.info("{} - {}", row.getString("title"), row.getString("lyrics"));
    }

    session.close();

    // Clean up the connection by closing it
    cluster.close();
  }


  // This method is an example of loading a truststore from a resource, decoding it with its password.
  private Cluster getCluster(String trustStoreLocation, String trustStorePassword, String host) {
    Cluster cluster;
    SSLContext sslcontext = null;

    try {

      InputStream is = ClientToNode.class.getResourceAsStream(trustStoreLocation);
      KeyStore keystore = KeyStore.getInstance("jks");
      char[] pwd = trustStorePassword.toCharArray();
      keystore.load(is, pwd);

      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
      tmf.init(keystore);
      TrustManager[] tm = tmf.getTrustManagers();

      sslcontext = SSLContext.getInstance("TLS");
      sslcontext.init(null, tm, null);
    } catch (KeyStoreException kse) {
      logger.error(kse.getMessage(), kse);
    } catch (CertificateException e) {
      logger.error(e.getMessage(), e);
    } catch (NoSuchAlgorithmException e) {
      logger.error(e.getMessage(), e);
    } catch (KeyManagementException e) {
      logger.error(e.getMessage(), e);
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
    }

    JdkSSLOptions sslOptions = JdkSSLOptions.builder()
      .withSSLContext(sslcontext)
      .build();

    cluster = Cluster.builder()
      .withClusterName("cassandra")
      .withCredentials("casss", "cass")
      .addContactPoint(host)
      .withPort(9042)
      .withProtocolVersion(ProtocolVersion.V3)
      .withSSL(sslOptions)
      .build();

    return cluster;
  }

}

您使用什么代码进行java连接?我将其添加到帖子中如果您使用
-Djavax.net.debug=ssl运行程序,它应该会向您显示出现这种情况的真正原因。我怀疑这是主机名验证…您应该检查
system.log
,看看它是否也生成了服务器端异常。这可能会对这个问题有更多的了解。