Приложение Java зависает, если сеть изменена - PullRequest
0 голосов
/ 31 октября 2009

Я работаю над приложением eclipse, которое имеет несколько представлений. Из этих представлений мне нужно получить доступ к некоторым данным по проводам. В следующем сценарии выдается ошибка.

Шаг 1: Запустите приложение, все работает нормально.
Шаг 2: Отключить сеть
Шаг 3: Включить сеть
Шаг 4: Попробуйте получить доступ к данным по проводам из одного из представлений. Приложение видимо зависает.
Шаг 5: Теперь, если вы попытаетесь получить доступ к данным из другого представления, все будет работать.

Сначала я думал, что это происходит из-за кэширования DNS JVM. Поэтому я сделал что-то подобное.

System.setProperty( "networkaddress.cache.ttl", "0" );
System.setProperty( "networkaddress.cache.negative.ttl" , "0" );

Но проблема все еще существует. Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 31 октября 2009

Полностью дикий догадка: если вы используете TCP, ваше приложение может не заметить, что его сокет был отключен. Если он заблокирован при чтении, он может не заметить, пока не попытается что-то записать в сокет. Это зависит от того, насколько «чистым» является отключение сокета - если сокет не получает пакет RST с другой стороны, он не будет знать, что другой конец пропал.

Вы можете попробовать принудительно создать дамп потока из вашего приложения. Обычно JVM реагирует либо на Ctrl - \ при работе на терминале, либо на сигнал kill -QUIT с трассировкой стека каждого потока. Это позволило бы вам увидеть, где обсуждаемая тема заблокирована.

Если вы можете опубликовать некоторый подозрительный код, было бы намного проще попытаться поставить диагноз. Или вы можете объяснить, почему вы думаете, что кеширование DNS будет проблемой?

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

Еще один вариант просмотра текущего стека, когда ваше приложение зависает, - использовать jps / jstack (в комплекте с Sun JDK, начиная с 1.5) или visualvm (доступно в 1.6 SDK и отдельно от https://visualvm.dev.java.net/)

jps перечисляет все текущие процессы Java на компьютере. затем вы можете вызвать jstack с каждым из этих идентификаторов процесса, чтобы получить текущий стек.

Возможно, если бы вы могли опубликовать такую ​​трассировку стека, мы могли бы помочь.

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

это, вероятно, между шагами 2 и 3. Какой тип исключения выдается?

...