2012-12-20 11 views
15

Pracuję nad klientem WebService i chcę ustawić limit czasu dla mojego wywołania WebService. Próbowałem różnych podejść, ale nadal nie jestem w stanie tego osiągnąć. Używam JAX-WS do generowania kodu z WSDL. Używam JBoss-eap-5.1 jako App Server i JDK1.6.0_27. Znalazłem te różne podejścia do ustawiania limitu czasu, ale żaden z nich nie działa dla mnie.Jak ustawić limit czasu dla JAX-WS WebService Zadzwoń

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."); 

Na razie co mam zrobić jest, nazwałem moją metodę webservices od wewnątrz wykonawca. Wiem, że to nie jest dobre podejście, ale działa dla mnie. Faceci, proszę, pomóż mi to zrobić we właściwy sposób.

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(); 
     } 

Odpowiedz

18

można spróbować te ustawienia (są sparowane być stosowany w parach)

BindingProviderProperties.REQUEST_TIMEOUT 
BindingProviderProperties.CONNECT_TIMEOUT 

BindingProviderProperties powinna wynosić od com.sun.xml.internal.WS.client

Or struny for JBoss:

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

Wszystkie właściwości, które należy umieścić na getRequestContext() i n milisekund.

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

Dla JBoss konkretnie, warto skorzystać z właściwości StubExt.PROPERTY_CLIENT_TIMEOUT od org.jboss.ws.core.StubExt. Aby uzyskać szczegółowe informacje, patrz this thread.

+1

StubExt.PROPERTY_CLIENT_TIMEOUT pracował dla mnie, ale jest wyjątek tylko po '3 * Dla timeoutMillisecond' przykład: Jeśli 'timeoutMillisecond = 3000' niż wyjątek jest generowany po 9000 milisekundach, ale' Timeout after: 3000ms' jest zapisany w pliku dziennika – mariami

+0

Dzięki @mariami To działało dla mnie. Wyjątkiem jest wyrzucanie we właściwym czasie, a nie po 3 * timeoutMillisecond. Chociaż aby to zadziałało, musiałem usunąć niektóre słoiki z biblioteki jboss związane z jax, inaczej dawało NoClassDefFoundError: javax/xml/ws/spi/Provider21. –

2

Upgrade jbossws natywne biblioteki i skorzystać StubExt.PROPERTY_CLIENT_TIMEOUT

do uaktualniania jbossws rodzimymi, wykonaj tę link.

* jbossws-native-3.4.0 to najnowsza obsługiwana wersja Jboss 5.1.0GA. Można zobaczyć JBossWS - Supported Target Containers

ten pracował dla mnie

5

jak Kolos powiedział należy użyć:

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

i łańcuch wartości to:

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

Chociaż nie należy stosować opakowań wewnętrznych , jest to jedyny sposób, jeśli pracujesz z domyślnym JDK6. Tak więc, w tym ustawienie limitu czasu odbioru i połączyć przypadku powinny być wykonane z:

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

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

ale uważaj, stałe wartości są różne, jeśli używasz innej implementacji referencyjnej JAXWS, tj JAXWS-RT 2.1.4 BindingProviderProperties:

com.sun.xml.ws.client.BindingProviderProperties 

będziesz mieć różne wartości ciąg dla REQUEST_TIMEOUT i CONNECT_TIMEOUT:

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

Należy zauważyć, że dany czas oczekiwania ma być podany jako liczba całkowita! – geld0r

2

F lub mnie ustawienie javax.xml.ws.client.connectionTimeout i javax.xml.ws.client.receiveTimeout rozwiązało problem.

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

odnoszą link

1

Ustawianie następujące opcje pracuje dla mnie. Używam implementacji Metro JAXWS.

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

PortType jest interfejsem punktu końcowego usługi WWW.

Wartości powyższych dziedzinach od com.sun.xml.internal.ws.developer.JAXWSProperties

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";