2012-03-02 2 views
11

javax.xml.soap API (javax.xml.soap.SOAPConnectionFactory, javax.xml.soap.SOAPConnection 및 친구들)를 사용하여 대부분의 경우 큰 성공을 거두며 원격 서버에 웹 서비스 호출을합니다.javax.xml.soap.SOAPConnection을 사용하여 소켓 읽기 제한 시간 설정하기

그러나 때때로 문제가있어 프로그램이 영원히 멈추지 않습니다.

이 문제를 해결하려면 읽기 시간 초과를 추가하고 싶습니다.

나는 이것을 달성하는 것이 가능할 수있는 몇 가지 방법을 발견했지만, 모두 상당히 나빠 보였다.

커뮤니티에 대한 제 질문은 javax.xml.soap API를 사용하여 호출 할 때 읽기 시간 초과 동작을 구현하는 가장 좋은 방법은 무엇입니까?

+0

안녕하세요 사무엘 질문과 같은 문맥을 사용하기 때문에 아래에서 질문을보십시오. 여기에 제안 할 수 있기를 바랍니다. https://stackoverflow.com/questions/47861767/http-connect-timeout-and-read-timeout-for-urlstreamhandler-with-saaj-working-fo –

답변

26

당신은 당신의 자신의 URLStreamHandler 당신이 연결 시간 제한 같은 URLConnection 매개 변수를 설정하고 읽을 수 있도록 제한 시간을 만들어야합니다.

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); 
URL endpoint = 
    new URL(new URL("http://yourserver.yourdomain.com/"), 
      "/path/to/webservice", 
      new URLStreamHandler() { 
      @Override 
      protected URLConnection openConnection(URL url) throws IOException { 
       URL target = new URL(url.toString()); 
       URLConnection connection = target.openConnection(); 
       // Connection settings 
       connection.setConnectTimeout(10000); // 10 sec 
       connection.setReadTimeout(60000); // 1 min 
       return(connection); 
      } 
      }); 

SOAPMessage result = connection.call(soapMessage, endpoint); 

명확성을 위해 일부 try/catch를 제거했습니다.

+0

openConnection에 전달 된 URL을 String으로 변환하고 target.openConnection이 정의중인 URLStreamHandler를 사용하지 못하도록 막습니까? –

+0

좋은 지적입니다. 나는 자신을 테스트하지는 않았지만, 당신이 옳은 것 같아요 : 무한 재귀가 닫혀 있다고 생각합니다.) 솔직히 말해서, 여기에서 그 코드를 얻습니다 : http://stackoverflow.com/questions/2148915/how-do-i-set- the-time-for-a-jax-ws-webservice-client –

+0

재밌 네요, 나는 그 질문을 보았지만 다른 문제이기 때문에 대답을 보지 않았다고 생각합니다. . –

2
import com.sun.xml.internal.ws.client.BindingProviderProperties 

public someResponse callWebService() { 

    MyPort port = new Service().getPort(); 

    Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext(); 

    requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 10 * 1000); //10 secs 

    requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 1 * 60 * 1000); //1 min 

    return port.someWebMethod(); 

} 
+0

'서비스'? 나는 당신이 내가 묻는 질문과 다른 질문에 답할 것 같아요. –

+0

이 스 니펫은 WSDL –

+0

을 통해 웹 서비스에 서비스 포트를 가져 오기 위해 JAX-WS 주석을 사용하는 것과 같습니다. 이는 매우 유용합니다. –