Come imposto il timeout per un client webservice JAX-WS?

Ho usato JAXWS-RI 2.1 per creare un’interfaccia per il mio servizio web, basata su un WSDL. Posso interagire con il servizio web senza problemi, ma non sono stato in grado di specificare un timeout per l’invio di richieste al servizio web. Se per qualche ragione non risponde, il cliente sembra girare le ruote per sempre.

La caccia in giro ha rivelato che probabilmente dovrei provare a fare qualcosa del genere:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000); ((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000); 

Ho anche scoperto che, a seconda della versione di JAXWS-RI che hai, potresti aver bisogno di impostare queste proprietà invece:

 ((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000); ((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000); 

Il problema che ho è che, indipendentemente da quale dei precedenti è corretto, non so dove posso farlo. Tutto quello che ho è una sottoclass di Service che implementa l’interfaccia generata automaticamente al webservice e al momento che questa viene instanciata, se il WSDL non risponde, è già troppo tardi per impostare le proprietà:

 MyWebServiceSoap soap; MyWebService service = new MyWebService("http://www.google.com"); soap = service.getMyWebServiceSoap(); soap.sendRequestToMyWebService(); 

Qualcuno può indicarmi la giusta direzione ?!

So che questo è vecchio e ha risposto altrove, ma si spera che questo lo chiuda. Non sono sicuro del motivo per cui vorresti scaricare il WSDL in modo dinamico ma le proprietà del sistema:

 sun.net.client.defaultConnectTimeout (default: -1 (forever)) sun.net.client.defaultReadTimeout (default: -1 (forever)) 

dovrebbe applicarsi a tutte le letture e si connette usando HttpURLConnection che usa JAX-WS. Questo dovrebbe risolvere il tuo problema se stai ricevendo il WSDL da una postazione remota – ma probabilmente un file sul tuo disco locale è migliore!

Quindi, se si desidera impostare i timeout per servizi specifici, dopo aver creato il proxy è necessario eseguire il cast in un BindingProvider (che già conosci), ottenere il contesto della richiesta e impostare le proprietà. La documentazione online JAX-WS è errata, questi sono i nomi di proprietà corretti (beh, funzionano per me).

 MyInterface myInterface = new MyInterfaceService().getMyInterfaceSOAP(); Map requestContext = ((BindingProvider)myInterface).getRequestContext(); requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); // Timeout in millis requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 1000); // Timeout in millis myInterface.callMyRemoteMethodWith(myParameter); 

Certo, questo è un modo orribile di fare le cose, creerei una bella fabbrica per produrre questi fornitori di binding che possono essere iniettati con i timeout che vuoi.

Le proprietà nella risposta accettata non hanno funzionato per me, probabilmente perché sto utilizzando l’implementazione JBoss di JAX-WS?

L’utilizzo di un diverso set di proprietà (che si trova nella Guida dell’utente JBoss JAX-WS ) ha funzionato:

 //Set timeout until a connection is established ((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "6000"); //Set timeout until the response is received ((BindingProvider) port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000"); 

Ecco la mia soluzione di lavoro:

 // -------------------------- // SOAP Message creation // -------------------------- SOAPMessage sm = MessageFactory.newInstance().createMessage(); sm.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true"); sm.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8"); SOAPPart sp = sm.getSOAPPart(); SOAPEnvelope se = sp.getEnvelope(); se.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/"); se.setAttribute("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"); se.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); se.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); SOAPBody sb = sm.getSOAPBody(); // // Add all input fields here ... // SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); // ----------------------------------- // URL creation with TimeOut connexion // ----------------------------------- URL endpoint = new URL(null, "http://myDomain/myWebService.php", new URLStreamHandler() { // Anonymous (inline) class @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); } }); try { // ----------------- // Send SOAP message // ----------------- SOAPMessage retour = connection.call(sm, endpoint); } catch(Exception e) { if ((e instanceof com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl) && (e.getCause()!=null) && (e.getCause().getCause()!=null) && (e.getCause().getCause().getCause()!=null)) { System.err.println("[" + e + "] Error sending SOAP message. Initial error cause = " + e.getCause().getCause().getCause()); } else { System.err.println("[" + e + "] Error sending SOAP message."); } } 
 ProxyWs proxy = (ProxyWs) factory.create(); Client client = ClientProxy.getClient(proxy); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(0); httpClientPolicy.setReceiveTimeout(0); http.setClient(httpClientPolicy); 

Questo ha funzionato per me.

Se si utilizza JAX-WS su JDK6, utilizzare le seguenti proprietà:

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

Non sono sicuro se questo ti aiuterà nel tuo contesto …

L’object soap può essere lanciato come BindingProvider?

 MyWebServiceSoap soap; MyWebService service = new MyWebService("http://www.google.com"); soap = service.getMyWebServiceSoap(); // set timeouts here ((BindingProvider)soap).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000); soap.sendRequestToMyWebService(); 

D’altra parte se si desidera impostare il timeout sull’inizializzazione dell’object MyWebService, questo non sarà di aiuto.

Questo ha funzionato per me quando volevo interrompere le singole chiamate WebService.

il modo più semplice per evitare il lento recupero del WSDL remoto quando si istanzia il SEI è di non recuperare il WSDL dall’endpoint del servizio remoto in fase di runtime.

ciò significa che devi aggiornare la tua copia WSDL locale ogni volta che il fornitore di servizi apporta una modifica rilevante, ma significa anche che devi aggiornare la tua copia locale ogni volta che il fornitore di servizi apporta una modifica rilevante.

Quando genero i miei stub client, dico al runtime JAX-WS di annotare il SEI in modo tale da leggere il WSDL da una posizione predeterminata sul classpath. per impostazione predefinita, la posizione è relativa al percorso del pacchetto del servizio SEI


       

l’attributo wsldLocation dice al SEI dove è ansible trovare il WSDL e la copia si assicura che il wsdl (e il supporto xsd .. ecc.) sia nella posizione corretta.

poiché la posizione è relativa al percorso del pacchetto di SEI, creiamo un nuovo sottoprogetto (directory) chiamato wsdl e copia tutti gli artefatti di wsdl lì.

tutto quello che devi fare a questo punto è assicurarti di includere tutti * .wsdl, * .xsd oltre a tutti * .class quando crei il file jar artefatto client-stub.

(Nel caso in cui sei curioso, l’annotazione @webserviceClient è dove questa posizione wsdl è effettivamente impostata nel codice java

 @WebServiceClient(name = "httpServices", targetNamespace = "http://www.helter.com/schema/helter/httpServices", wsdlLocation = "./wsdl/helterHttpServices.wsdl") 

Se il tuo server delle applicazioni è WebLogic (per me era 10.3.6), le proprietà responsabili dei timeout sono:

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