Я недавно наблюдал исключение NoHostAvailableException: все хосты попытались выполнить запрос (не пытался хост) , за которым java. net .SocketException: программное обеспечение вызвало прерывание соединения : recv не удалось на двух разных сайтах, которые работали без перебоев с последних 8-10 дней. Я проверил другие связанные вопросы о том же самом, но у них были разные проблемы, такие как несколько сеансов и время ожидания сокета. Я не знаю, в чем может быть причина. Вот мой код для подключения
public class CassandraConnector {
private Cluster cluster;
private Session session;
/**
* No-Args constructor
*/
private CassandraConnector() {
}
/**
* static method to return the instance of CassandraConnector using static
* class CassandraConnectorHolder's static INSTANCE
*
* @return static instance of CassandraConnector
*/
public static CassandraConnector getInstance() {
return CassandraConnectorHolder.INSTANCE;
}
private static class CassandraConnectorHolder {
private static final CassandraConnector INSTANCE = new CassandraConnector();
}
/**
* returns the instance of Cassandra Session
* {@link com.datastax.driver.core.Session}
*
* @return instance of Cassandra Session
* {@link com.datastax.driver.core.Session}
*/
public Session getSession() {
return session;
}
/**
* This method is used to close the Cassandra session and cluster
*/
public void close() {
session.close();
cluster.close();
}
/**
* This method is used to connect to Cassandra cluster using
* ipAddress(HostName) passed as parameter
*
* @param ipAddress String
*/
public void connect(String ipAddress) {
//cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(9042).build();
SocketOptions options = new SocketOptions();
options.setConnectTimeoutMillis(60000);//1 minute
options.setReadTimeoutMillis(120000);//2 minute
options.setTcpNoDelay(true);
cluster = Cluster.builder().addContactPoint(ipAddress).withPort(9042).withSocketOptions(options).build();
final Metadata metadata = cluster.getMetadata();
System.out.println("Connected to cluster: " + metadata.getClusterName());
for (final Host host : metadata.getAllHosts()) {
System.out.println("Datacenter: " + host.getDatacenter() + "Host:" + host.getAddress() + " Rack: " + host.getRack());
}
session = cluster.connect();
}
}
, и вот журнал, который я обнаружил, он был одинаковым на обоих сайтах.
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_121]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_121]
at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[?:1.8.0_121]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_121]
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_121]
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_121]
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_121]
at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_121]
at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_121]
at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_121]
at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_121]
at marc.socket.LoggerServer$ServeRequest.run(LoggerServer.java:136) [MARC%20Logger.jar:1.0]
2020-03-06 22:05:53 INFO [meter-reader] ModbusMeterReader:592 - Closed Serial for 33967
2020-03-06 22:05:53 INFO [meter-reader] ModbusMeterReader:659 - Final Object {"meter":"33967","slot":"2020-03-06 22:05:44.909","E":"E"}
2020-03-06 22:05:53 DEBUG [meter-reader] LoggerServer:320 - Sent Data from Logger Server
2020-03-06 22:05:53 ERROR [meter-reader] LoggerServer:324 - PrintWriter has error while sending
2020-03-06 22:05:53 ERROR [meter-reader] LoggerServer:326 - Added socket to dead list
2020-03-06 22:05:53 ERROR [meter-reader] ModbusMeterReader:697 - Error
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:84) ~[cassandra-driver-core-3.4.0.jar:?]
at com.datastax.driver.core.exceptions.NoHostAvailableException.copy(NoHostAvailableException.java:37) ~[cassandra-driver-core-3.4.0.jar:?]
at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37) ~[cassandra-driver-core-3.4.0.jar:?]
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:245) ~[cassandra-driver-core-3.4.0.jar:?]
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:68) ~[cassandra-driver-core-3.4.0.jar:?]
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:59) ~[cassandra-driver-core-3.4.0.jar:?]
at marc.util.CassandraDatabase.insertData(CassandraDatabase.java:92) ~[MARC%20Logger.jar:1.0]
at marc.logger.ModbusMeterReader.startReading(ModbusMeterReader.java:678) ~[MARC%20Logger.jar:1.0]
at marc.controllers.ControlPanelController.startAcquisition(ControlPanelController.java:1226) ~[MARC%20Logger.jar:1.0]
at marc.controllers.ControlPanelController$3.lambda$run$0(ControlPanelController.java:1170) ~[MARC%20Logger.jar:1.0]
at java.util.Iterator.forEachRemaining(Iterator.java:116) [?:1.8.0_121]
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) [?:1.8.0_121]
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) [?:1.8.0_121]
at marc.controllers.ControlPanelController$3.run(ControlPanelController.java:1168) [MARC%20Logger.jar:1.0]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_121]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_121]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_121]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_121]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_121]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_121]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
Это связано с ошибкой сокета или это связано с Cassandra. Должен ли я добавить опцию Тайм-аут сокета для Кассандры?