来自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
,看看它是否也生成了服务器端异常。这可能会对这个问题有更多的了解。