El Send Port ALL.Exceptions utiliza el pipeline ESBFaultProcessor, este pipeline está compuesto por varios componentes pipeline, entre estos el ESB.Exceptions.Encoder, el cual serializa todas las propiedades del mensaje de error en un mensaje XML.
El pipeline ESBFaultProcessor utiliza el método ExceptionMgmt.IsExceptionSerializable(), de tal manera que cuando una excepción contiene excepciones internas no serializables a más de un nivel de profundidad, El método ExceptionMgmt.IsExceptionSerializable() comprueba que sólo la excepción de la raíz sea serializable, y como resultado, el ESBFaultProcessor falla. Cuando se presenta este caso los mensajes del puerto ALL.Exceptions de la aplicación BizTalk Microsoft.Practices.ESB quedan en estado suspended (resumable), esto se puede visualizar en la consola de administración de BizTalk
Al hacer doble clic en la instancia suspendida del puerto ALL.Exceptions, se puede visualizar el error 115004
Para solucionar este inconveniente se debe crear la clase propuesta por Thomas F. Abraham http://www.tfabraham.com/blog/2010/07/fix-for-biztalk-esb-toolkit-2-0-error-115004-in-all-exceptions-send-port/
A continuación un ejemplo del uso de la clase en una orquestación, que genera una excepción no serializable cuando un cliente se encuentra inactivo.
Para reproducir el error se creó una excepción personalizada (BusinessException), la cual no se puede serializar.
Luego se crea en la orquestación una excepción del tipo BusinessException
Posteriormente se realiza una validación en la orquestación con el fin de lanzar la excepción del tipo BusinessException
El contenido de Lanzar Excepción, es el siguiente:
Para realizar las pruebas de esta aplicación se copia un archivo con la información del cliente en un directorio, cuando el estado del cliente es diferente de 1 se genera una excepción de cliente invalido, la cual no se puede registrar en la base de datos de excepciones del esb, debido a que se produce el error 115004.
Finalmente para lograr que la excepción quede registrada en la base de datos de excepciones del ESB, se debe invocar el método FixNonSerializableExceptionInFaultMsg (propuesto por Thomas F. Abraham) en la construcción del mensaje de Falla en el bloque de excepciones de la orquestación
Y ahora si la excepción quedara registrada en la base de datos de excepciones del ESB y se podrá visualizar en el portal del ESB.
Descarga el código del ejemplo y cópialo en la carpeta C:\Projects
El código esta en BizTalk Server 2010
iTSynergy.ESB.SerializableException
1. Hacer doble clic en la solución iTSynergy.ESB.SerializableException.sln
2. Compilar el proyecto iTSynergy.ESB.SerializableException.Helper
3. Hacer deploy del proyecto iTSynergy.ESB.SerializableException
4. Ingresar a la consola de administración de BizTalk e importar el archivo de bindings (iTSynergy.ESB.SerializableExceptionBindings) en la aplicación iTSynergy.ESB.SerializableException
5. Para realizar las pruebas ingresar a la carpeta Process y copia el archivo ClienteInvalido.xml en la carpeta IN.
Leave a Reply