miércoles, 14 de marzo de 2018

Forzar Publish Para Lanzar Fault En Servicios One-Way - OSB 12c

Suele ocurrir que en ciertas situaciones, dentro de un flujo OSB, se hace uso de la actividad Publish para llamar a un Business Service del tipo One-Way. En estos casos la gran mayoria de llamadas se efectúan a la perfección. Pero que pasaría si un error ocurre del otro lado y por ser una llamada del tipo One-Way no hay forma de devolver una Excepción o Mensaje Fault?

En el presente articulo se muestra como configurar la actividad Publish para que tenga un comportamiento en particular y nos devuelva un Mensaje Fault.



Caso de Uso

Para entender mejor la problematica que se intenta solventar, observe el siguiente escenario:


Un flujo OSB recibe un XML, el mismo XML se intenta Insertar en una tabla en Base de Datos llamada TABLA_CLIENTES haciendo uso de la actividad Publish que consume un Busines Service que es quien realiza el INSERT a la tabla.

El Business Service por algun motivo de validación del tipo de datos, o por algun otro problema genera un Fallo y como resultado de la actividad Publish que solo realiza una llamada sin esperar una respuesta sigue adelante y procede con la siguiente Actividad.

Finalmente el flujo OSB envia la respuesta a quien corresponda sin registrar que el Business Service tuvo un fallo.


Esto claramente no es lo esperado... ya que si el Business Service genera un fallo y explota por algun motivo debería de arrojar un mensaje Fault y salir por el Error Handler del flujo OSB (algo que actualmente NO esta sucediendo):




En este caso, se trata de insertar un dato del tipo String en un campo del tipo NUMBER en la tabla en Base de Datos.

Esto genera un fallo ya que no se puede convertir un String en un Decimal, el registro NO se inserta y la actividad Publish no lanza el mensaje Fault. Siendo imposible de gestionar el Error en el Error Handler del flujo OSB.




Solución

Luego de analizar la problematica, de buscar en foros y googlear la causa de la misma... Me tope con la ayuda de mi colega @Jhussef quien me dio una mano tan precisa como la siguiente imagen:


La traducción de aquel párrafo:
Si llama a un Business Service con Quality of Service en Exactly Once o At Least One, OSB esperará hasta que se complete el procesamiento en el Business Service antes de continuar y es efectivamente una llamada síncrona.


Esto quiere decir, que debemos añadir la propiedad Quality of Service (abreviado QoS) con valor Exactly Once. Para ello:


1_ Arrastre y suelte dentro de la actividad Publish una actividad Routing Options:




2_ Configurar la actividad Routing Options de la siguiente manera:




De esta forma, cuando se vuelve a ejecutar el flujo OSB... se puede visualizar en el Trace de Invocación como ahora SI el Business Service falla por alguna razon y esta vez SI lanza el mensaje Fault al Error Handler del servicio:




Siendo capaces de gestionar correctamente la excepción en el Error Handler del servicio.

Ante cualquier inquietud, sugerencia de edición o duda se puede debatir libremente y con respeto en los comentarios de este articulo.

No hay comentarios:

Publicar un comentario