2010-06-24 2 views
0

연결이 시간 초과되었습니다. 개발자가 아이디어 목록의 맨 아래에 있습니다.java.net.URLConnection 시간 초과에 대한 도움말?

try { 
     final URLConnection connection = url.openConnection(); 
     connection.setConnectTimeout(CONNECT_TIME_SECONDS * 1000); 
     connection.setReadTimeout(READ_TIME_SECONDS * 1000); 
     is = connection.getInputStream(); 
     document = builder.parse(is); 
    } catch (SAXException e) { 
     log.error(e); 
     throw new PageContentException(e); 
    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 

내 추측이 url.openConnection은() 전과 연결 을 열려고한다는 것입니다 : 같은

[6/24/10 6:32:34:032 EDT] 0000000d ThreadMonitor W WSVR0605W: Thread "WebContainer : 136" (0000c53e) has been active for 719542 milliseconds and may be hung. There is/are 45 thread(s) in total in the server that may be hung. 

그리고 코드는 같습니다

로그

친절한이 연결 제한 시간이 무언가 합리적으로 낮아졌지만, API에있는 nothing은 내가 어떻게 다르게 할 수 있는지 보여줍니다.

시도해 볼 것을 제안합니까?

+0

CONNECT_TIME_SECONDS 및 READ_TIME_SECONDS의 값은 얼마입니까? CONNECT_TIME_SECONDS는 READ_TIME_SECONDS – Enrique

+0

60과 60보다 커야합니다. 연결 시간은 연결하는 데 60 초가 걸리므로 읽기 시간 초과가 계산을 시작하여 60 초 동안 데이터를 읽어야합니다. –

답변

2

나는 스레드 덤프를 얻고 이 정확히 인 것을 볼 수 있습니다. 추측하지 마십시오. 그럼 거기에 붙어있는 이유를 알 수 있습니다. 이미 스레드 덤프가있는 경우 스택 추적을 게시하십시오.

+0

이 블록 앞뒤에 로거 메시지가 있습니다. "before"메시지는 "after"를 얻지 않고 연속으로 50 번째 번 나타납니다.다음 번에 스택 추적을 잡아서 다행이지만 기다려야합니다. 몇 시간 전에 서버를 다시 시작 했으므로 이전 스택 추적은 사라졌습니다. –

+1

대답에 + +. 나는이 것을 실수로했다. 로그 메시지는 * 코드의 다른 * 섹션과도 일치합니다. 원래의 개발자는 약간의 잘라내어 붙여 넣기를 수행했습니다. timeout을 준수하는 connection.getInputStream()을 호출하는 대신 타임 아웃을 준수하지 않는 두 번째 코드 블록에서 url.openStream()을 호출했습니다. kill -3 힙 덤프를 사용하면 코드에서 * 정확한 * 자리를 얻었습니다. –

-3

아마도 "최종"때문일 수 있습니다. 왜 당신이 그곳에 가는지 모르겠지만, 마지막을 제거하는 것이 도움이 될 것이라고 생각합니다.

+0

'최종'때문에 절대로 없습니다 – unbeli

+0

결승으로 나중에 연결을 다시 지정할 수 없도록합니다. 타임 아웃을 일으키지 않아야한다고 생각하지 않습니다. –

+0

왜 그렇게 생각하니? 제발 정교하게 말하십시오 ... –

1

url.openConnection()이 연결 제한 시간을 적당한 값으로 낮추기 전에 연결을 시도하고 있지만 API의 어떤 것도 내가 어떻게 다르게하는지 보여주지 않습니다.

나는 이것이 가능한 시나리오라고 생각합니다. 연결 시도가 시작된 후 연결 시간 초과를 설정하는 것은 거의 불가능합니다. IMO.

무엇을 시도해 볼 것을 제안합니까?

시스템 속성에서 "sun.net.client.defaultConnectTimeout"속성을 설정해 보았습니까? 문서는 here입니다.

+0

그래, 승자가 될지도 모른다. 어쨌든 +1. –

+1

나는 이것이 사실이라고 생각하지 않는다. 스트림은 스트림이 요청되거나 명시 적 connect()가 완료 될 때까지 연결이 시작되지 않아야합니다. – unbeli

+0

@unbeli - 특정 시간 초과 매개 변수없이 소켓을 열면 해당 속성이 연결 시간 초과를 제공하는 것으로 가정합니다. AFAIK, 여기서 일어나는 일입니다. –

0

내 추측은 연결 타임 아웃이 합리적인 뭔가 로 저하되기 전에 url.openConnection() 을 시도하는 연결을 열 수 있다는 것입니다.

아니요.이 경우 URLConnection.setConnectionTimeout()은 이전보다 훨씬 빨리 호출 할 수 있기 때문에 완전히 무의미합니다.

+0

URL을 사용하지 않고 연결을 만든 다음 열기 만하면 유용 할 수 있습니다. 문제는 URL이 열린 연결을 반환하고 열린 연결 만 반환한다는 것입니다. –

+0

아니요 연결을 반환합니다. 그런 다음 설정 된 시간 초과 메소드를 호출합니다. 그런 다음 I/O를 수행합니다. 이 시점에서만 실제 TCP/IP 연결이 형성됩니다. – EJP

+0

@downvoter 설명해주십시오. – EJP