Cuando se llama a los servicios web, existen varios escenarios para los Business Operation, que actúan juntos para controlar lo que sucederá cuando no se obtenga una respuesta en el tiempo deseado. (Esto también es importante, por ejemplo, en el caso de una solicitud HTTP simple que no pertenezca a los servicios SOAP). Los tres principales escenarios involucrados son los siguientes:

  • Tiempo de espera de respuesta
  • Especifica el tiempo límite de espera para obtener una respuesta del servidor web remoto.

  • Intervalo de reintento
  • Número de segundos de espera entre los intentos para conectarse con un destino fuera de Ensemble.

  • Tiempo de espera para error
  • Número total de segundos durante los que se intenta conectar con un destino fuera de Ensemble. Cuando transcurren esos segundos, el Business Operation descarta los datos del mensaje y devuelve un código de un error.

     

    En la práctica:

    Esperaremos una respuesta del servidor web durante los segundos del “Tiempo de espera de respuesta”. Si no se recibió ninguna respuesta durante ese tiempo, llamaremos de nuevo al servidor web una vez que hayan transcurrido los segundos del “Intervalo de reintento”. Seguiremos intentando que se produzca este “Tiempo de espera para error” hasta que hayan transcurrido los segundos desde que se realizó el primer intento.

     

    Para explicarlo, vamos a poner un ejemplo.

    Asumimos el siguiente escenario:

    Es decir:

    Tiempo de espera de respuesta: se espera durante 7 segundos para obtener una respuesta

    Intervalo de reintento: reintentos cada 10 segundos

    Tiempo de espera para error: se deja de intentar después de 30 segundos

    Por lo tanto, asumiendo que la respuesta llega después de exactamente 8 segundos, ocurrirá el siguiente escenario:

  • A los 00:00 segundos realizaremos la primera solicitud
  • A los 00:07 segundos, debido a que no se emitió ninguna respuesta, admitiremos de forma interna que se produjo un error en el “Tiempo de espera de respuesta” [registraremos un "Evento de error" en el Registro de eventos] y se realizará un nuevo intento, según las políticas y la configuración de los reintentos. El “Tiempo de espera para error” aún no se ha producido, por lo que se activará un indicador del tipo "Es necesario intentarlo de nuevo".
  • [A las 00:08, el servidor web devolverá una respuesta, pero esta respuesta no podrá recibirse porque ya existe un error con uno de los tiempos de espera].
  • A los 00:10 segundos, se inicia el “Intervalo de reintento”, y como se activa el indicador "Es necesario intentarlo de nuevo", haremos la segunda solicitud al servidor web.
  • A los 00:17 segundos, habremos llegado de nuevo a nuestro “Tiempo de espera de respuesta” sin que hayamos obtenido una respuesta (como se mencionó anteriormente, la respuesta que se envió a los 00:08 segundos (paso #3) “se ignoró o se descartó”), por lo que nuevamente indicaremos esto de forma interna como un error (aunque esta vez no se agregará otra entrada de Error en el registro de eventos, solo se creará durante el primer intento, no en todos los reintentos fallidos) y, dado que aún no hemos alcanzado el “Tiempo de espera para error”, volveremos a activar el indicador "Es necesario intentarlo de nuevo".
  • [A las 00:18 el servidor web devolverá una respuesta, la cual otra vez no recibiremos]
  • A los 00:20 segundos, se inicia otro “Intervalo de reintento” y haremos nuestra tercera solicitud.
  • A los 00:27 segundos, no obtuvimos ninguna una respuesta, nuevamente se obtuvo un error en el “Tiempo de espera de respuesta” y es necesario intentarlo nuevamente (aún no se alcanzó el “Tiempo de espera para error”).
  • [A los 00:28 segundos el servidor envía una respuesta, que no se recibirá]
  • A los 00:30 segundos, se inicia otro “Intervalo de reintento” y realizaremos nuestro cuarto (y último) intento.
  • A los 00:37 segundos se produce nuevamente un “Tiempo de espera de respuesta”. Esta vez ocurrió un error por el "Tiempo de espera para error”, por lo que no se activa un indicador del tipo "Es necesario intentarlo de nuevo", sino que desistimos - registramos un evento de error en el Registro de eventos, indicando que se ha llegado al "Tiempo límite de espera agotado", y también devolvemos un error del Business Operation hacia el elemento que se solicitó.  
  • A continuación se muestra una llamada de prueba, según el escenario anterior.

    Primero, en el lado del servidor [From the SOAP log]: se puede ver que recibió 4 llamadas/solicitudes, con 10 segundos de diferencia, devolviendo cada vez una respuesta 8 segundos después de que se realizó la solicitud.

    \* \* *
    05/31/2016 14:18:45 *********************
    Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    <envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> </envelope>
    ...
     

     

    05/31/2016 14:18:53 *********************
    Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    05/31/2016 14:18:55 *********************
    Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    05/31/2016 14:19:03 *********************
    Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    05/31/2016 14:19:05 *********************
    Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    05/31/2016 14:19:13 *********************
    Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    05/31/2016 14:19:15 *********************
    Input to Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    05/31/2016 14:19:23 *********************
    Output from Web service with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     

     

    Y ahora desde el lado del cliente o del BO (Business Operation) en ensemble , se ven 4 intentos, con 10 segundos de diferencia entre cada uno de ellos, registrando cada vez un error en el tiempo límite de espera para la respuesta tras 7 segundos. 

    Lado del cliente.

     

    05/31/2016 14:18:45 *********************
    Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     
     
    05/31/2016 14:18:52 *********************
    Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ERROR #5922: Timed out waiting for response
    string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
         ERROR #5922: Timed out waiting for response
     
    05/31/2016 14:18:55 *********************
    Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     
     
    05/31/2016 14:19:02 *********************
    Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ERROR #5922: Timed out waiting for response
    string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
         ERROR #5922: Timed out waiting for response
     
    05/31/2016 14:19:05 *********************
    Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     
     
    05/31/2016 14:19:12 *********************
    Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ERROR #5922: Timed out waiting for response
    string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
         ERROR #5922: Timed out waiting for response
     
    05/31/2016 14:19:15 *********************
    Output from Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ...
     
     
    05/31/2016 14:19:22 *********************
    Input to Web client with SOAP action = http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
    ERROR #5922: Timed out waiting for response
    string**** SOAP client return error. method=GetResponse, action=http://tempuri.org/Test.WSTimeouts.WebService.GetResponse
         ERROR #5922: Timed out waiting for response

     

    Aquí se puede ver la traza de Ensemble

     

     

    Y aquí las entradas del registro de eventos:  

     

     

    Ejemplo del registro de eventos con rastreo de los eventos [Posiblemete se necesite hacer zoom para leer mejor el texto de la imagen] 

     

     

    Aquí puende observarse algunas de las "funciones internas" para el escenario que se describió anteriormente.

    En el ID de registro núm. 684 se lleva a cabo la solicitud inicial, a las 17:09:16.

    Entonces, 7 segundos más tarda (09:23) obtenemos el error en el tiempo límite de espera para la respuesta (#658). Entonces se registr el error (#687) y se decide esperar otros 3 segundos hasta el "intervalo de reintento", es decir, transcurren 10 segundos de "intervalor de reintento" menos 7 segundos de "tiempo límite de espera para la respuesta" (#688-#690).

    Después de que transcurran los 3 segundos en espera ( a las 9:26; #691) se realiza el segundo intento (#692), con el mismo comportamiento posterior , hasta el cuarto intento (#704). Cuando el cuarto intento falla (09:53; #705), ya no se realiza otro intento ya que se ha excedido el tiempo de espera para error permitido (30 segundos).