2016-07-18 3 views
0

내 Java 클라이언트 응용 프로그램에서 HttpsURLConnection을 사용하여 내 서버에 연결하고 있습니다. 이 모든 작업은 특정 시간을 제외하고는 전혀 시간 초과되지 않습니다. 나는 그런 (5000 MS)와 같은 연결의 시간 초과 매개 변수 설정 :제한 시간에는 제한이 없습니다? - HttpsURLConnection

HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 

// timeouts 
con.setConnectTimeout(5000); 
con.setReadTimeout(5000); 

con.setRequestMethod("put"); 
con.setDoInput(true); 
con.setDoOutput(true); 
con.setRequestProperty("Content-length", String.valueOf(output.length())); 
OutputStreamWriter os = new OutputStreamWriter(con.getOutputStream(), "UTF-8"); 
BufferedWriter writer = new BufferedWriter(os); 
writer.write(output); 
writer.close(); 
os.close(); 

con.connect(); 

int respCode = con.getResponseCode(); 

if(respCode == 200) { 
     InputStreamReader is = new InputStreamReader(con.getInputStream()); 
     BufferedReader br = new BufferedReader(is); 
     String input; 
     String respBody = ""; 
     while ((input = br.readLine()) != null){ 
      respBody += input; 
     } 
     br.close(); 
     is.close(); 
     this.result = respBody; 
} 

내가 모든 예외를 잡는거야,하지만 아무도 등록하지, 그래서 문제는 캐치되지 않는 예외가 될 수 없습니다. 연결은 단순히 시간 초과되지 않습니다. 나는 3 분을 기다렸고 응답이 없었다. 요청을 실행하는 동안 네트워크를 전환하는 동안 버그를 몇 번 재현 할 수있었습니다.

또한 가끔 약 1 분 후에 응답이있었습니다. 시간 초과보다 더 긴 시간입니다.

HttpsURLConnection을 연결 해제 한 후 제한 시간이 지나면 요청이 들어오는 스레드에 이미 인터럽트를 시도했습니다. 그러나 그것보다 깔끔한 해결책이 있어야합니다. 이 무한정 시간 초과가 어디에서 왔는지 알고 싶습니다.

아이디어가 있으십니까?

고맙습니다. 내 댓글에서

+0

어떤 URL에 연결 하시겠습니까? 나는 당신의 질문에 대한 답이 당신이 타격을 가하는 서버에 달려 있다고 믿습니다 : 만약이 서버가 무한한 열린 연결을 가지면 당신의 관찰을 설명 할 수 있습니다. –

+1

시간 초과시 발생하는 예외는 [java.net.SocketTimeoutException] (https://docs.oracle.com/javase/7/docs/api/java/net/SocketTimeoutException.html)이어야합니다. 이미 런타임 예외가 아니므로 잡아라. (코드에서 그렇게하는 것을 볼 수는 없다.) 또한 [API] (https://docs.oracle.com/javase/7/docs/api/java/net/URLConnection.html#setConnectTimeout%28int%29)에서 알 수 있습니다. "이것에 대한 일부 비표준 임 플리 멘 테이션 메소드가 지정된 타임 아웃을 무시할 수 있습니다. 연결 시간 초과 세트를 보려면 getConnectTimeout()을 호출하십시오. " 힌트가 될 수도 있습니다 ... – Mena

+0

@Mena 실제로 getConnectTimeout() 결과를 인쇄 할 때 값을 할당 할 때마다 항상 0 (무한)이됩니다. 이제 HttpsURLConnection에는 setConnectTimeout() 메서드의 "비표준 구현"이 있다는 것을 알았습니다. 그럼에도 불구하고 무한 타임 아웃을 어떻게 제한 할 수 있습니까? – Zxifer

답변

1

타임 아웃의 경우에 던져 예외는 런타임 예외가 아니다 당신이 이미 잡기해야 java.net.SocketTimeoutException,해야한다 (당신은 당신의 코드에서 그렇게 볼 수 없습니다 그래도). 이 방법의

일부 비표준 implmentation가 지정된 시간 제한을 무시할 수

는 또한 API에서 있습니다. 연결 시간 제한 설정을 보려면 getConnectTimeout()으로 전화하십시오. 나는 getConnectTimeout() 결과를 인쇄 할 때 귀하의 코멘트 사실

에서

, 난 항상 상관없이 내가 할당하는 값 0 (무한) 얻을. 이제 HttpsURLConnectionsetConnectTimeout() 메서드의 "비표준 구현"이 있음을 알게되었습니다. 하지만 그럼에도 불구하고 무한한 시간 제한을 어떻게 제한 할 수 있습니까?

  • 는 "주위 랩"A 신속하고 추한 솔루션의 call 재정로 이동하여 연결을 설정하는 코드 Callable<String> (그 매개 변수화 타입 나는 유형으로 가정 무엇 result 변수).
  • 현재이 호출 스레드에서 단일 스레드 Executor을 사용하여 새 Callable<String>을 제출하십시오.
  • 그런 다음 Future<String>에서 get을 호출하고 원하는 시간 초과 값을 사용하여 TimeoutException을 적절히 처리하십시오.의 구현에

A (아마도) 더 장기적인 솔루션

  • abstract class HttpsURLConnection 당신이 취급하고, 버그가 있는지있다/그것을 구현 누구와 통신합니다.
+0

답장을 보내 주셔서 감사합니다. 내 코드를 깊이 파고 들어 와서 시간 제한을 설정하는 방법이 잘못되었음을 알았습니다. 타임 아웃 값으로 자바 환경 설정을 사용했는데 이것들은 제대로 설정되지 않았습니다. 내 코드 setConnectTimeout() 및 setReadTimeout() 사용하여 지금 잘 작동하는 것. 그럼에도 불구하고 사용자의 빠르고 추악한 솔루션은 여기에 언급 된 것처럼 Window의 21 초 제한 시간과 같은 다른 (더 긴) 시간 제한을 줄일 수 있다는 점에서 더 나은 솔루션입니다. http://stackoverflow.com/questions/14026223/ java-httpurlconnection-timeout-does-not-work – Zxifer

+0

@ Zxifer 당신을 환영합니다. 결국 결국 모든 것이 * 당신이 정말로 원하는 시간에 달려 있다고 생각합니다 - 비동기식 실행 관용구를 사용하는 것은 실제 연결을 둘러싸고있는 일련의 명령이 아니라 오히려 일반적 일 수 있다고 생각할 때 편리 할 수 ​​있습니다 그것의. – Mena