2012-12-20 4 views
15

WebService 클라이언트에서 작업 중이고 WebService 호출에 대한 시간 초과를 설정하려고합니다. 나는 다른 접근법을 시도했지만 여전히 이것을 성취 할 수 없다. WSDL에서 코드 생성을 위해 JAX-WS를 사용하고 있습니다. 저는 JBoss-eap-5.1을 App Server 및 JDK1.6.0_27로 사용하고 있습니다. 시간 제한을 설정하기 위해 이러한 diff 접근 방식을 찾았지만 어느 것도 나를 위해 일하고 있지 않습니다. 지금은 무엇을했는지에 대한 JAX-WS WebService 호출에 대한 시간 제한을 설정하는 방법


URL mbr_service_url = new URL(null,GlobalVars.MemberService_WSDL, new URLStreamHandler() { 

      @Override 
      protected URLConnection openConnection(URL url) throws IOException { 
       URL clone_url = new URL(url.toString()); 
       HttpURLConnection clone_urlconnection = (HttpURLConnection) clone_url.openConnection(); 
       // TimeOut settings 
       clone_urlconnection.setConnectTimeout(10000); 
       clone_urlconnection.setReadTimeout(10000); 
       return (clone_urlconnection); 
      } 
     }); 
     MemberService service = new MemberService(mbr_service_url); 
     MemberPortType soap = service.getMemberPort(); 
     ObjectFactory factory = new ObjectFactory(); 
     MemberEligibilityWithEnrollmentSourceRequest request = factory.createMemberEligibilityWithEnrollmentSourceRequest(); 

     request.setMemberId(GlobalVars.MemberId); 
     request.setEligibilityDate(value); 

     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000); 
     ((BindingProvider) soap).getRequestContext().put(com.sun.xml.internal.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000); 
     System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); 
     System.setProperty("sun.net.client.defaultReadTimeout", "10000"); 

     MemberEligibilityWithEnrollmentSourceResponse response = soap.getMemberEligibilityWithEnrollmentSource(request); 
     logger.log("Call to member service finished."); 

, 나는 집행자 내부에서 내 웹 서비스 방법을 불렀다한다. 나는 그 좋은 접근 방식이 아니라 나를 위해 일한다는 것을 안다. 얘들 아, 제게 올바른 방법으로 도와주세요.

javax.xml.ws.client.connectionTimeout 
javax.xml.ws.client.receiveTimeout 

:

logger.log("Parameters set for createorUpdateContact call.\nGoing in Executor Service."); 
     ExecutorService executorService = Executors.newSingleThreadExecutor(); 
     executorService.execute(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        response = soap.getMemberEligibilityWithEnrollmentSource(request); 
       } catch (MemberServiceException ex) { 
        logger.log("Exception in call to WebService", ex.fillInStackTrace()); 
       } 
      } 
     }); 
     executorService.shutdown(); 
     try { 
      executorService.awaitTermination(GlobalVars.WSCallTimeOut, TimeUnit.SECONDS); 
     } catch (InterruptedException ex) { 
      logger.log("Thread Interrupted!", ex); 
      executorService.shutdownNow(); 
     } 

답변

18

당신은

BindingProviderProperties.REQUEST_TIMEOUT 
BindingProviderProperties.CONNECT_TIMEOUT 

BindingProviderProperties이 문자열 for JBosscom.sun.xml.internal.WS.client

또는에서해야한다 (그들은 쌍으로 사용되는 페어링)이 설정을 시도해 볼 수도 있습니다 모든 속성을 넣어 수 getRequestContext() 난 n 밀리 초.

(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec); 

보스 구체적으로, 당신은 org.jboss.ws.core.StubExt에서 재산 StubExt.PROPERTY_CLIENT_TIMEOUT을 사용할 수 있습니다 들어

. 자세한 내용은 this thread을 참조하십시오.

+1

StubExt.PROPERTY_CLIENT_TIMEOUT이 나를 위해 일하지만, 예외가 전용 후'3 * timeoutMillisecond' 를 throw되는 com.sun.xml.internal.ws.developer.JAXWSProperties에서 위 필드의

값 예 : 예외보다 'timeoutMillisecond = 3000'이 9000 밀리 초 후에 throw되지만 로그 아웃 파일에'Timeout after : 3000ms'이 기록 된 경우 – mariami

+0

감사합니다. @mariami 저에게 효과적입니다. 그리고 예외는 3 * timeoutMillisecond 후에가 아니라 적절한 시간에 throw됩니다. 그것이 작동하도록하기 위해 jax와 관련된 jboss lib에서 jar를 제거해야했지만 그렇지 않은 경우 NoClassDefFoundError를 제공했습니다. javax/xml/ws/spi/Provider21. –

2

업그레이드 jbossws 네이티브 라이브러리와 jbossws-출신이 link에 따라 업그레이드를 들어 StubExt.PROPERTY_CLIENT_TIMEOUT

를 사용합니다.

* jbossws-native-3.4.0은 Jboss 5.1.0GA에서 지원되는 최신 버전입니다.

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

그리고 문자열 값은 다음과 같습니다 :

com.sun.xml.internal.ws.connect.timeout 
com.sun.xml.internal.ws.request.timeout 

내부 패키지를 사용하지 않아야하지만 당신은

5

처럼 kolossus은 사용한다고 말했다 이것은 나를 위해 일한 JBossWS - Supported Target Containers

를 볼 수 있습니다 , 이것은 기본 JDK6로 작업하는 유일한 방법입니다. 따라서, 수신 및 연결 시간 설정이 경우에 수행해야합니다 : 다른 잭스 - WS 참조 구현을 사용하는 경우

bindingProvider.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,requestTimeoutMs); 

bindingProvider.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,connectTimeoutMs); 

그러나 조심, 상수 값이 다른, 즉 잭스 - WS-RT 2.1.4 BindingProviderProperties :

com.sun.xml.ws.client.BindingProviderProperties 

서로 다른 문자열 REQUEST_TIMEOUT 값과 CONNECT_TIMEOUT해야합니다 :

com.sun.xml.ws.request.timeout 
com.sun.xml.ws.connect.timeout 
+0

주어진 타임 아웃은 Integer로 주어진다는 것을주의하십시오! – geld0r

2

F를 또는 나를 javax.xml.ws.client.connectionTimeoutjavax.xml.ws.client.receiveTimeout으로 설정하면 문제가 해결됩니다.

((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout); 
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout); 

에는 다음과 같은 옵션이 나를 위해 작동 설정 link

1

를 참조하십시오. Metro JAXWS 구현을 사용하고 있습니다.

((BindingProvider)portType).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, 10000); 
((BindingProvider) portType).getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, 50000); 

portType은 웹 서비스 끝점 인터페이스입니다.

public static final java.lang.String CONNECT_TIMEOUT = "com.sun.xml.internal.ws.connect.timeout"; 
public static final java.lang.String REQUEST_TIMEOUT = "com.sun.xml.internal.ws.request.timeout"; 
관련 문제