SocketTimeoutException на Solaris 9 не выдается - PullRequest
1 голос
/ 06 октября 2009

У меня есть соединение, которое должно получать сердцебиение каждые две минуты.

Однако иногда что-то происходит, и сеть выходит из строя. По какой-то причине 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 никогда не вызывалось.

Есть идеи?

Код работает во всех случаях, кроме таймаутов.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 06 октября 2009

Посмотрите на http://bugs.sun.com/view_bug.do?bug_id=6596323 и посмотрите, решит ли она вашу проблему

0 голосов
/ 06 октября 2009

Мне интересно, можно ли что-нибудь сделать с:

if (reader.ready()) { int ch = reader.read(); } 

И, возможно, короткий перерыв между вызовами этого метода.

...