2010-06-28 36 views
12

Tengo problemas para establecer el tiempo de espera de jax-ws. Mi código es:Configuración del tiempo de espera del cliente 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); 
    } 
} 

Y el uso:

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

¿Cómo conecto en los tiempos de espera? He encontrado una "solución" aquí: https://jax-ws.dev.java.net/guide/HTTP_Timeouts.html pero no sé dónde la voy a enganchar. ¿Cómo obtener un proxy? Cuando llamo a getPort, el cliente intenta conectarse y luego se cuelga para siempre si el servidor no responde.

ACTUALIZACIÓN: Este código se invoca desde el método applets init() si eso hace la diferencia.

Respuesta

0

Puede convertir su objeto VoipDB en BindingProvider. Entonces, en el ejemplo del enlace que acaba de dar, simplemente reemplace proxy por db y listo.

+1

En realidad, esto no funciona porque el cliente se cuelga en la línea en la que se llama getPort. – Lukasz

+0

Bueno, eso es todo lo que puedes hacer con el método provisto en el enlace. jax-ws descarga el WSDL del servicio para crear el proxy. Lo más probable es que esto sea lo que le cause problemas. Lo único que se me ocurre en este momento es descargar una copia local de WSDL y usarla, pero por supuesto esto no es realmente elegante ... – musiKk

1

Si está utilizando un Sun JRE, puede establecer las siguientes propiedades del sistema para la conexión de red predeterminada y los tiempos de espera de lectura (en milisegundos). No he probado esto con el cliente JAX-WS, pero que deberían trabajar allí también:

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

Adición: no vi a su última parte de la pregunta donde dice que usted está haciendo esto en un applet. Si el applet se ejecuta con permisos predeterminados, probablemente no tenga permiso para configurar las propiedades del sistema.

+0

Applet está firmado. Esto es difícil de reproducir Porque el cliente se bloquea cuando el servidor se cuelga (no cuando está inactivo). – Lukasz

+1

Puede simular un servidor TCP colgante con este código de servidor: ServerSocket serverSocket = new ServerSocket (PORT); while (true) { serverSocket.accept(); } Solo acepte, pero nunca lea o escriba nada en el lado del "servidor ficticio". – 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

En realidad eso es lo que dice en la primera respuesta (y en la pregunta en sí) También tal vez tiene sentido 'importar com.sun.xml.ws.developer.JAXWSProperties' y usar' JAXWSProperties.CONNECT_TIMEOUT' y 'JAXWSProperties.REQUEST_TIMEOUT' si alguien no tiene miedo de juntarse con los internos de Sun. –

+0

¿Cómo obtengo la instancia de wsPort? – mvmn

+1

Parece que no funciona en absoluto. –

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

Esto funcionó para mí.

0

Aquí es un ejemplo

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"); 
} 
Cuestiones relacionadas