2012-03-29 43 views
16

Tengo un programa que usa javax.xml.ws.Service para llamar a un servicio remoto definido por un WSDL. Este programa se ejecuta en Google App Engine que, de forma predeterminada, establece el tiempo de espera de la conexión HTTP en 5 segundos {1}. Necesito aumentar este valor de tiempo de espera, ya que este servicio a menudo demora mucho tiempo para responder, pero como esta solicitud no se realiza con URLConnection, no puedo encontrar la manera de llamar al URLConnection.setReadTimeout(int) {2} o cambiar el tiempo de espera.¿Puedo configurar globalmente el tiempo de espera de las conexiones HTTP?

¿Hay alguna manera de establecer globalmente el tiempo de espera de la conexión HTTP en App Engine? Y, con el propósito de compartir el conocimiento, ¿cómo se podría resolver este tipo de problema en general?

{1}: https://developers.google.com/appengine/docs/java/urlfetch/overview#Requests

{2}: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

Respuesta

4

Ver https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet

Usted puede hacer algo como esto para conseguir un URLConnection:

URL url = new URL("http://www.example.com/atom.xml"); 
    URLConnection tempConnection = url.openConnection(); 
    tempConnection.setReadTimeout(10); 
+0

Todo el problema es que un objeto 'URLConnection' nunca está disponible para mí. La solicitud se realiza de una manera opaca que usa 'javax.xml.ws.Service' –

8

Prueba esto:

Port port = service.getPort(endPointInterface); //or another "getPort(...)" 
((BindingProvider) port).getRequestContext() 
    .put(BindingProviderProperties.REQUEST_TIMEOUT, 30); 
+0

No he intentado esto todavía, pero obtienes la recompensa por proporcionar una respuesta que no he visto en ningún otro lado todavía. –

12

Puede intentar establecer las propiedades del sistema sun.net.client.defaultConnectTimeout y sun.net.client.defaultReadTimeout documentadas here, p. Ej.

System.setProperty("sun.net.client.defaultReadTimeout", "30000"); 
System.setProperty("sun.net.client.defaultConnectTimeout", "30000"); 

EDITAR

Lo sentimos, acaba de volver a leer y se dio cuenta que esto es en Google App Engine. No estoy seguro, pero dada la relación litigiosa que tienen Google y Oracle últimamente, supongo que GAE no ejecuta Oracle JVM. Dejaré esto aquí en caso de que alguien más se encuentre con un problema similar.

+0

Enlace a la documentación: http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html –

1

Para App Engine con JAX-WS, debe establecer el contexto de la solicitud (probado hoy con SDK 1.9.15). Para las máquinas normales, no puede ir más allá de los 60 y tendría que cambiar a las máquinas más grandes (Bx) para utilizar mejor una cola de tareas.

Para las pruebas locales normalmente usaría BindingProviderProperties.CONNECT_TIMEOUT y BindingProviderProperties.REQUEST_TIMEOUT, pero no están en la Lista blanca de JRE de App Engine y su inspección de código podría advertirlo constantemente. Las cuerdas equivalentes se pueden utilizar sin embargo:

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

Para la implementación de App Engine:

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

un ejemplo completo de cómo aplicar eso a código generado automáticamente JAX-WS 2.x, los valores debe proporcionarse en milisegundos:

@WebEndpoint(name = "Your.RandomServicePort") 
public YourServiceInterface getYourRandomServicePort() { 
    YourRandomServiceInterface port = super.getPort(YOURRANDOMSERVICE_QNAME_PORT, YourRandomServiceInterface.class); 
    Map<String, Object> requestContext = ((BindingProvider)port).getRequestContext(); 
    requestContext.put("com.sun.xml.ws.connect.timeout", 10000); 
    requestContext.put("com.sun.xml.ws.request.timeout", 10000); 
    return port; 
} 
Cuestiones relacionadas