2009-10-31 2 views
0

여러보기가있는 Eclipse 응용 프로그램에서 작업 중입니다. 이 견해들에서 전선을 통해 일부 데이터에 액세스해야합니다. 다음 시나리오에서는 오류가 발생합니다.네트워크가 수정 된 경우 Java 응용 프로그램이 응답하지 않음

1 단계 : 앱을 시작하면 모든 것이 정상적으로 작동합니다.
2 단계 : 네트워크 사용 안 함
3 단계 : 네트워크 사용
4 단계 :보기 중 하나에서 데이터를 통해 데이터에 액세스를 시도합니다. 앱이 분명히 멈춘다.
5 단계 : 이제 다른보기에서 데이터에 액세스하려고하면 모든 것이 작동합니다.

처음에는 JVM에 의한 DNS 캐싱으로 인해 발생한다고 생각했습니다. 그래서 나는 이런 것을했다.

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

하지만 여전히 문제가 있습니다. 어떤 도움을 주셔서 감사합니다.

+0

1 가지 더. 2 단계와 3 단계 사이에 네트워크가 다운되면 데이터에 액세스 할 수 없지만 응용 프로그램이 멈추지 않습니다. – Duleb

답변

1

완전히 과장된 추측 : TCP를 사용하는 경우 앱에서 소켓이 분리되었음을 알지 못할 수 있습니다. 읽기에서 차단 된 경우 소켓에 무엇인가 쓰기를 시도 할 때까지 알 수 없습니다. 그것은 소켓 셧다운이 "깨끗한"방법에 달려있다 - 소켓이 다른 쪽에서 RST 패킷을받지 못한다면 다른 쪽이 사라 졌다는 것을 알지 못할 것이다.

응용 프로그램에서 스레드 덤프를 강제로 시도해 볼 수 있습니다. 일반적으로 JVM은 터미널에서 실행될 때 Ctrl- \ 또는 모든 스레드의 스택 추적이있는 kill -QUIT 신호에 응답합니다. 그러면 해당 스레드가 차단 된 위치를 알 수 있습니다.

일부 의심스러운 코드를 게시 할 수 있다면 진단하기가 훨씬 쉽습니다. 아니면 왜 DNS 캐싱이 문제라고 생각하는지 설명 할 수 있습니까?

0

아마도 2 ~ 3 단계 일 것입니다. 어떤 유형의 예외가 발생합니까?

+1

예외는 없습니다. 그냥 달려있다. – Duleb

0

앱이 JPS/jstack을를 사용하는 것입니다 걸려 현재 스택을 볼 수있는 또 다른 옵션 또는 VisualVM과 (https://visualvm.dev.java.net/ 별도로 1.6의 SDK에서 사용할 수)

JPS 목록 (썬의 JDK 1.5로 시작와 함께 제공) 시스템상의 모든 현재의 Java 프로세스 당신은 현재 스택을 얻기 위해 각각의 프로세스 id와 함께 jstack을 호출 할 수있다.

아마도 우리가 도울 수있는 그러한 스택 추적을 게시 할 수 있다면.

관련 문제