He usado JAXWS-RI 2.1 para crear una interfaz para mi servicio web, basada en un WSDL. Puedo interactuar con el servicio web sin problemas, pero no he podido especificar un tiempo de espera para enviar solicitudes al servicio web. Si por alguna razón no responde, el cliente parece girar sus ruedas para siempre.
La búsqueda ha revelado que probablemente debería intentar hacer algo como esto:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);
También descubrí que, según la versión de JAXWS-RI que tenga, es posible que deba establecer estas propiedades en su lugar:
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);
El problema que tengo es que, independientemente de cuál de las anteriores sea correcta, no sé dónde puedo hacer esto. Todo lo que tengo es una Service
subclase que implementa la interfaz generada automáticamente para el servicio web y en el punto en que esto se está instanciando, si el WSDL no responde, entonces ya es demasiado tarde para establecer las propiedades:
MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();
¿Alguien puede señalarme en la dirección correcta?
Respuestas:
Sé que esto es antiguo y se ha respondido en otro lugar, pero espero que esto lo cierre. No estoy seguro de por qué querría descargar el WSDL dinámicamente, pero las propiedades del sistema:
debería aplicarse a todas las lecturas y conexiones mediante HttpURLConnection que utiliza JAX-WS. Esto debería resolver su problema si obtiene el WSDL desde una ubicación remota, ¡pero un archivo en su disco local probablemente sea mejor!
A continuación, si desea establecer tiempos de espera para servicios específicos, una vez que haya creado su proxy, debe enviarlo a un BindingProvider (que ya conoce), obtener el contexto de la solicitud y establecer sus propiedades. La documentación de JAX-WS en línea es incorrecta, estos son los nombres de propiedad correctos (bueno, funcionan para mí).
Por supuesto, esta es una forma horrible de hacer las cosas, crearía una buena fábrica para producir estos proveedores de enlace que se pueden inyectar con los tiempos de espera que desee.
fuente
Las propiedades en la respuesta aceptada no me funcionaron, posiblemente porque estoy usando la implementación JBoss de JAX-WS.
El uso de un conjunto diferente de propiedades (que se encuentran en la Guía del usuario de JBoss JAX-WS ) lo hizo funcionar:
fuente
Aquí está mi solución de trabajo:
fuente
Esto funcionó para mí.
fuente
Si está utilizando JAX-WS en JDK6, utilice las siguientes propiedades:
fuente
com.sun.xml.internal.ws.connect.timeout
vscom.sun.xml.ws.connect.timeout
) también la clase (o interfaz) que las define (com.sun.xml.internal.ws.developer.JAXWSProperties
/com.sun.xml.internal.ws.client.BindingProviderProperties
vscom.sun.xml.ws.developer.JAXWSProperties
/com.sun.xml.ws.client.BindingProviderProperties
). Mi mejor idea es configurar ambos, usando valores literales como claves.En caso de que su servidor de aplicaciones sea WebLogic (para mí fue 10.3.6), las propiedades responsables de los tiempos de espera son:
fuente
No estoy seguro de si esto ayudará en su contexto ...
¿Se puede convertir el objeto soap como BindingProvider?
Por otro lado, si desea establecer el tiempo de espera en la inicialización del objeto MyWebService, esto no ayudará.
Esto funcionó para mí cuando quería agotar el tiempo de espera de las llamadas individuales de WebService.
fuente
La forma más fácil de evitar la recuperación lenta del WSDL remoto cuando crea una instancia de su SEI es no recuperar el WSDL del punto final del servicio remoto en tiempo de ejecución.
esto significa que debe actualizar su copia WSDL local cada vez que el proveedor de servicios realiza un cambio impactante, pero también significa que debe actualizar su copia local cada vez que el proveedor de servicios realiza un cambio impactante.
Cuando genero mis stubs de cliente, le digo al tiempo de ejecución de JAX-WS que anote el SEI de tal manera que lea el WSDL desde una ubicación predeterminada en la ruta de clases. por defecto, la ubicación es relativa a la ubicación del paquete del Servicio SEI
el atributo wsldLocation le dice al SEI dónde se puede encontrar el WSDL, y la copia se asegura de que el wsdl (y el xsd de soporte, etc.) esté en la ubicación correcta.
dado que la ubicación es relativa a la ubicación del paquete de SEI, creamos un nuevo subpaquete (directorio) llamado wsdl, y copiamos todos los artefactos wsdl allí.
todo lo que tiene que hacer en este punto es asegurarse de incluir todos los * .wsdl, * .xsd además de todos los * .class cuando cree su archivo jar de artefactos de resguardo de cliente.
(en caso de que tenga curiosidad, la anotación @webserviceClient es donde esta ubicación wsdl se establece realmente en el código java
fuente