2010-06-10 22 views
10

que tienen que poner en práctica un cliente de servicio web en un archivo WSDL dado. que utiliza la herramienta 'wsimport' del SDK para crear clases Java desde el WSDL, así como una clase que se envuelven es único método del servicio web (enhanceAddress(auth, param, address)) en un método Java simple. Hasta aquí todo bien. El servicio web es funcional y devuelve los resultados de forma correcta. El código es el siguiente:Detalles de conexión y los tiempos de espera en un cliente de servicios web Java

try { 
    EnhancedAddressList uniservResponse = getWebservicePort().enhanceAddress(m_auth, m_param, uniservAddress); 
    //Where the Port^ is the HTTP Soap 1.2 Endpoint 
}catch (Throwable e) { 
    throw new AddressValidationException("Error during uniserv webservice request.", e); 
} 

El problema ahora: necesito para obtener información sobre la conexión y cualquier error que pudiera ocurrir con el fin de llenar varios valores JMX (como COUNT_READ_TIMEOUT, COUNT_CONNECT_TIMEOUT, ...) por desgracia, el método no lanza oficialmente ninguna excepción, por lo que a fin de obtener detalles acerca de un ConnectException, necesito utilizar getCause() en el ClientTransportException que será lanzado.

Peor aún: He intentado poner a prueba el valor de tiempo de espera de lectura, pero no hay ninguno. Cambié la ubicación del servicio en el archivo wsdl para publicar la solicitud en un script php que simplemente espera para siempre y no regresa. Adivina qué: el cliente del servicio web no hace , no, pero también aguarda por siempre (maté la aplicación después de más de 30 minutos de espera). Esa no es una opción para mi aplicación, ya que eventualmente me quedo sin conexiones tcp si algunos de ellos se 'atascan'.

El método enhanceAddress(auth, param, address) no está implementado, pero está anotado con javax.jws. * Anotaciones, lo que significa que no puedo ver/cambiar/inspeccionar el código que se está ejecutando realmente.

¿Tengo alguna opción que tirar toda wsimport/javax.jsw-materia lejos y poner en marcha mi propio cliente de jabón?

Respuesta

14

de configurar lectura de tiempo de espera y conecte los tiempos de espera se puede configurar los parámetros de unión Al configurar el servicio y un puerto casos:


Service = new Service(); 

    Port = Service.getPort(); 

    ((BindingProvider) Port).getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
      "http://localhost:8080/service"); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.CONNECT_TIMEOUT, 
      30); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.REQUEST_TIMEOUT, 
      30); 

ahora cada vez que se ejecuta un servicio a través de "Puerto" obtendrá tiempos de espera de respuesta y/o tiempos de espera de conexión si el backend responde lentamente. los valores siguen los valores de tiempo de espera de la clase de socket.

Cuando se exceden estos tiempos de espera, obtendrá excepción de tiempo de espera o una excepción de conexión y puede poner contra-código para realizar un seguimiento de cuántos obtiene.

+0

Ya que tenía el problema hace 2 semanas, escribí mi propio cliente. A pesar de eso, probé tu enfoque y ¡está funcionando! Encontré un código similar en ese momento, pero de alguna manera me dio una ClassCastException cuando intenté enviar contenido a BindingProvider. – f1sh

+0

Tengo un problema similar, PERO el tiempo de espera ocurre cuando obtengo el puerto, ¿cómo lo resuelvo? – maugch

Cuestiones relacionadas