java - programacion - iseries que es
¿Puedo configurar globalmente el tiempo de espera de las conexiones HTTP? (4)
Consulte https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet
Puedes hacer algo como esto para obtener un URLConnection:
URL url = new URL("http://www.example.com/atom.xml");
URLConnection tempConnection = url.openConnection();
tempConnection.setReadTimeout(10);
Tengo un programa que utiliza javax.xml.ws.Service
para llamar a un servicio remoto definido por un WSDL. Este programa se ejecuta en el motor de aplicaciones de Google que, de manera 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 toma mucho tiempo para responder, pero como esta solicitud no se realiza con URLConnection
, no puedo averiguar cómo llamar a URLConnection.setReadTimeout(int)
{2}, o de lo contrario cambiar el se acabó el tiempo.
¿Hay alguna forma de establecer globalmente el tiempo de espera de la conexión HTTP en el App Engine? Y, con el propósito de compartir el conocimiento, ¿cómo se podría resolver este tipo de problemas 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)
Para App Engine con JAX-WS, debe configurar el contexto de 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 la 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 App Engine JRE y su inspección de código puede advertirle constantemente sobre eso. Las cadenas equivalentes se pueden utilizar aunque:
com.sun.xml.internal.ws.connect.timeout
com.sun.xml.internal.ws.connect.timeout
Para la implementación en App Engine:
com.sun.xml.ws.connect.timeout
com.sun.xml.ws.request.timeout
Un ejemplo completo de cómo aplicar eso al código generado automáticamente desde JAX-WS 2.x, los valores se deben proporcionar 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;
}
Prueba esto:
Port port = service.getPort(endPointInterface); //or another "getPort(...)"
((BindingProvider) port).getRequestContext()
.put(BindingProviderProperties.REQUEST_TIMEOUT, 30);
Puede intentar configurar las propiedades del sistema sun.net.client.defaultConnectTimeout
y sun.net.client.defaultReadTimeout
documentadas here , por ejemplo
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
EDITAR
Lo sentimos, solo vuelva a leerlo y se dio cuenta de que esto está en Google App Engine. No lo sé con certeza, pero dada la relación litigiosa que Google y Oracle han tenido últimamente, supongo que GAE no ejecuta la JVM de Oracle. Dejaré esto aquí en caso de que alguien más se encuentre con un problema similar.