У меня есть соединение, которое должно получать сердцебиение каждые две минуты.
Однако иногда что-то происходит, и сеть выходит из строя. По какой-то причине Solaris считает, что соединение все еще живо, локально не возникает никаких исключений IOException, однако одно устанавливается удаленно.
Я установил таймаут для сокета, и при отладке из тестовой среды Windows XP мы можем подтвердить, что через две минуты и десять секунд сокет истекает, как ожидалось.
Есть ли какое-нибудь волшебное пение, которое я не повторяю, которое мне нужно, чтобы возникло исключение?
public void run() {
this.connect();
while (true) {
try {
InputStreamReader reader = new InputStreamReader(this.socket.getInputStream());
OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream(), "ISO-8859-1");
for (int errorCount = 0; errorCount < 15;) {
if (!this.readResponse(reader, writer)) {
errorCount++;
}
}
this.logger.error("read incomplete message for 15 times, reset the connection");
} catch (Exception e) {
this.logger.error("read response error", e);
} finally {
this.reconnect();
}
}
}
Где
private boolean readResponse(InputStreamReader reader, OutputStreamWriter writer) throws IOException {
int length = 0;
for (int i = 0; i < 2; i++) {
int ch = reader.read();
if (ch < 0) {
this.logger.error("read response buffer length error");
return false;
}
length = length * 256 + ch;
}
return true;
}
является началом метода readResponse.
Метод блокируется на int ch = reader.read (); в readResponse, как я и ожидал, исключение SocketTimeoutException никогда не вызывалось.
Есть идеи?
Код работает во всех случаях, кроме таймаутов.
Спасибо за любую помощь.