2012-12-20 18 views
15

Sto lavorando su un client WebService e desidero impostare un timeout per la mia chiamata di servizio Web. Ho provato approcci diversi ma ancora non sono in grado di raggiungere questo obiettivo. Sto usando JAX-WS per la generazione del codice da WSDL. Sto usando JBoss-eap-5.1 come App Server e JDK1.6.0_27. Ho trovato questi approcci diff per impostare il timeout, ma nessuno di loro sta funzionando per me.Come impostare il timeout per la chiamata del servizio Web JAX-WS

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

Per ora quello che ho fatto è che ho chiamato il mio metodo webservice da dentro un esecutore. So che non è un buon approccio, ma funziona per me. Ragazzi, per favore aiutatemi a farlo in modo corretto.

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

risposta

18

Si potrebbe provare queste impostazioni (sono accoppiati ad essere utilizzati in coppia)

BindingProviderProperties.REQUEST_TIMEOUT 
BindingProviderProperties.CONNECT_TIMEOUT 

BindingProviderProperties dovrebbe essere da com.sun.xml.internal.WS.client

O le corde for JBoss:

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

Tutte le proprietà da mettere su getRequestContext() i n millisecondi.

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

Per JBoss specificamente, si potrebbe desiderare di utilizzare la proprietà StubExt.PROPERTY_CLIENT_TIMEOUT da org.jboss.ws.core.StubExt. Vedi this thread per i dettagli.

+1

StubExt.PROPERTY_CLIENT_TIMEOUT funzionato per me, ma viene generata un'eccezione solo dopo '3 * timeoutMillisecond' Per esempio: Se 'timeoutMillisecond = 3000' viene lanciata l'eccezione dopo 9000 millisecondi, ma' Timeout dopo: 3000ms' è scritto nel file di registro – mariami

+0

Grazie a @mariami Ha funzionato per me. E l'eccezione viene lanciata al momento giusto, non dopo 3 * timeoutMillisecond. Sebbene per farlo funzionare ho dovuto rimuovere alcuni jar da jboss lib relativi a jax, altrimenti stava dando NoClassDefFoundError: javax/xml/ws/spi/Provider21. –

2

aggiornamento JBossWS-nativa biblioteca e utilizzare StubExt.PROPERTY_CLIENT_TIMEOUT

Per aggiornare JBossWS-native, seguono questa link.

* jbossws-native-3.4.0 è l'ultima versione supportata per Jboss 5.1.0GA. Si può vedere JBossWS - Supported Target Containers

Questo ha funzionato per me

5

Come Kolossus detto si dovrebbe usare:

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

and String valori sono:

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

Anche se i pacchetti interni non dovrebbero essere usati , questo è l'unico modo se lavori con il JDK6 predefinito. Così, in questa impostazione di ricezione e collegare timeout caso dovrebbe essere fatto con:

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

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

Ma attenzione, valori costanti sono diversi se si utilizza altra implementazione di riferimento jaxws, cioè jaxws-RT 2.1.4 BindingProviderProperties:

com.sun.xml.ws.client.BindingProviderProperties 

si avrà valori di stringa diversi per REQUEST_TIMEOUT e connect_timeout:

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

Si noti che il timeout specificato è previsto come numero intero! – geld0r

2

F o me impostazione javax.xml.ws.client.connectionTimeout e javax.xml.ws.client.receiveTimeout risolto il problema.

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

riferiscono link

1

Impostazione delle seguenti opzioni funziona per me. Sto usando l'implementazione Metro JAXWS.

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

portType è l'interfaccia dell'estremità del servizio Web.

valori dei campi sopra delle 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"; 
Problemi correlati