2010-03-20 22 views
8

Mam aplikację z architekturą serwera klienta. Klient korzysta z Java Web Start z Java Swing/AWT, a serwer używa serwera HTTP/Servlet z Tomcat. Komunikacja jest dokonywana z serializacji obiektów, Utwórz obiekt ObjectOutput serializuje tablicę bajtów i wysyła na serwer , odpowiednio, nazwany ObjectInputStream i deserializuje.java.net.SocketTimeoutException: upłynął limit czasu

Aplikacja po prawidłowym komunikowaniu się z określonym czasem współbieżności , rozpoczynając wyświetlanie błędu "Wyjątek czasu oczekiwania SocketException" na . Błąd pojawia się, gdy serwer wywołuje metodę ObjectInputStream.getObject() w mojej metodzie doPost serwletu.

Tomcat będzie działał wolno, a błędy zaczną skracać czas odpowiedzi serwera do czasu awarii, w którym muszę zrestartować serwer i po wszystkim.

Ktoś przeszedł ten problem?

kod klienta

URLConnection conn = url.openConnection(); 
conn.setDoOutput(true); 

OutputStream os = conn.getOutputStream(); 
ObjectOutputStream oss = new ObjectOutputStream(os); 

oss.writeUTF("protocol header sample"); 

oss.writeObject(_parameters); 
oss.flush(); 
oss.close(); 

Code Server

ObjectInputStream input = new ObjectInputStream(_request.getInputStream()); 
String method = input.readUTF(); 

parameters = input.readObject(); 

input.readObject() to gdzie jest błąd

+0

Czy możesz napisać jakiś kod? – Enrique

+0

To jest parametr linux tcp? Jak rozmiar memu bufora, maks. Otwarte pliki lub inne? –

+0

Czy ilość czasu, która upływa przed SocketException 20 minut lub dłużej? (jeśli pamiętam standardowy czas, w którym gniazdo TCP/IP będzie czekać, zanim upłynie limit czasu, jeśli nie będzie żadnego połączenia)? Po tym wszystkim wyjątek mówi "odczytać limit czasu" również może to mieć coś wspólnego z asynchronicznym charakterem sieci? – Wintermut3

Odpowiedz

10

Nie dały nam dużo informacji, aby przejść dalej, zwłaszcza o po stronie klienta. Ale moje podejrzenia, że ​​po stronie klienta jest:

  • braku do ustawiania nagłówka Content-Length (lub ustawienie go do niewłaściwej wartości),
  • braku opróżnić strumienia wyjściowego i/lub
  • nie zamyka strony wyjściowej gniazda.

Tajemniczy.

Na podstawie zaktualizowanego pytania wygląda na to, że żadna z powyższych. Oto kilka innych możliwości:

  • Z jakiegoś powodu strona klienta blokuje się całkowicie podczas serializacji lub BARDZO DŁUGIEGO CZASU.
  • Istnieje pośrednik między klientem a serwerem, który powoduje problemy.
  • Występują problemy związane z obciążeniem sieci lub problemy ze sprzętem sieciowym.

Innym możliwym wyjaśnieniem jest to, że masz wyciek pamięci, i że spowolnienie jest spowodowane przez GC sobą coraz więcej czasu, jak zabraknie pamięci. To pojawi się w dziennikach GC, jeśli je włączysz.

0

Wydaje mi się, że podczas wysokiej współbieżności, limit czasu połączenia ustawiony w urządzeniu Tomcat wygasł i połączenie zostało zamknięte. Następny odczytany przez Tomcat dla tego połączenia jest większy niż limit czasu serwera określony na serwerze.
Jeśli chcesz uniknąć tego problemu, musisz zwiększyć limit czasu po stronie serwera, który wygasł w twoim przypadku. Ale nie jest to zalecane.
Przy okazji nie podałeś wystarczających informacji. Czy zwiększyłeś liczbę wątków do połączenia w Tomcat? Jeśli tak, to na pewno by się stało.