2010-06-28 26 views
12

Ho problemi a impostare il timeout di jax-ws. Il mio codice è:Impostazione del timeout del client jax-ws

@WebServiceClient(name = "VoipDBJDBCService", targetNamespace = "http://db.server.voipmeter.jextreme.eu/", wsdlLocation = "http://trace0.nyc.blinkmind.com:8080/voipdb?wsdl") 
public class VoipDBJDBCService extends Service { 
    public VoipDBJDBCService(URL wsdlLocation) { 
     super(wsdlLocation, new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCService")); 
    } 

    @WebEndpoint(name = "VoipDBJDBCPort") 
    public VoipDB getVoipDBJDBCPort() { 
     return super.getPort(new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCPort"), VoipDB.class); 
    } 
} 

E l'utilizzo:

VoipDB db = new VoipDBJDBCService(new URL(url)).getVoipDBJDBCPort(); 

Come collego in timeout? Ho trovato "soluzione" qui: https://jax-ws.dev.java.net/guide/HTTP_Timeouts.html ma non so dove lo agganci. Come ottenere il proxy? Quando chiamo getPort, il client tenta di connettersi e quindi si blocca per sempre se il server non risponde.

AGGIORNAMENTO: Questo codice viene richiamato dal metodo init() dell'applets se questo fa alcuna differenza.

risposta

0

È possibile trasmettere l'oggetto VoipDB a BindingProvider. Quindi nell'esempio nel link che hai dato basta sostituire proxy per db e sei a posto.

+1

Questo in realtà non funziona perché client si blocca sulla linea dove getPort è chiamato. – Lukasz

+0

Bene, questo è tutto quello che puoi fare con il metodo fornito nel link. jax-ws scarica il WSDL del servizio per creare il proxy. Molto probabilmente questo è ciò che causa problemi a te. L'unica cosa che mi viene in mente adesso è scaricare una copia locale del WSDL e usarla, ma ovviamente non è molto elegante ... – musiKk

1

Se si utilizza Sun JRE, è possibile impostare le seguenti proprietà di sistema per la connessione di rete predefinita e la lettura dei timeout (in millisecondi). Non ho provato questi con il client JAX-WS, ma essi dovrebbero lavorare anche lì:

sun.net.client.defaultConnectTimeout 
sun.net.client.defaultReadTimeout 

Aggiunta: ho perso l'ultima parte della domanda in cui lei ha detto che si sta facendo questo in un'applet. Se l'applet è in esecuzione con autorizzazioni predefinite, probabilmente non ti è consentito impostare le proprietà del sistema.

+0

L'applet è firmata. Questo è difficile da riprodurre. Perché il client si blocca quando il server si blocca (non quando è inattivo). – Lukasz

+1

È possibile simulare un server TCP sospeso con questo codice server: ServerSocket serverSocket = new ServerSocket (PORT); while (true) { serverSocket.accept(); } Basta accettare, ma mai leggere o scrivere nulla sul lato "server fittizio". – auramo

6

con Metro/Glassfish ...

//1 minute for connection 
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.connect.timeout", 1 * 60 * 1000); 

//3 minutos for request 
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.request.timeout", 3 * 60 * 1000); 
+1

In realtà questo è ciò che viene detto in 1a risposta (e nella domanda stessa) Inoltre, forse ha senso importare com.sun.xml.ws.developer.JAXWSProperties e usare 'JAXWSProperties.CONNECT_TIMEOUT' e' JAXWSProperties.REQUEST_TIMEOUT' se qualcuno non ha paura di accoppiarsi con gli interni di Sun. –

+0

Come si ottiene l'istanza di wsPort? – mvmn

+1

Sembra non funzionare affatto. –

1
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.

0

Ecco un esempio

public void testConfigureTimeout() throws Exception 
{ 
    //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"); 

    port.echo("testTimeout"); 
} 
Problemi correlati