miércoles, 9 de abril de 2014

Banco de Mensajería de Ensemble


El banco de mensajería es una producción especial de Ensemble que está preparada para recoger mensajes de otras producciones remotas.

  
La utilidad del banco de mensajería es poder centralizar y unificar la mensajería de diferentes fuentes en un único repositorio de mensajes global.

Los mensajes son copiados (enviados) desde las producciones “cliente” hacia la producción de banco de mensajería. Los mensajes de las producciones origen o cliente no son eliminados después de ser enviados de manera que sigue siendo necesario el purgado de los mismos.

El banco de mensajería puede recibir cualquier mensaje de cualquier origen, sin embargo no dispone en su Namespace de las clases de definición de estos mensajes (excepto las del sistema como EnsLib.HL7.Message o cualquier otra disponible en los paquetes Ens o EnsLib). Para poder incorporar los mensajes personalizados (es decir los que no son del sistema) al banco de mensajería estos son “serializados” en XML. De esta manera la visualización de los mensajes a través del visor de mensajes cambia:


Menú “Ver” estándar

Menú “Ver” banco de mensajería

En el caso del banco de mensajería, al ser una producción tiene sus propios mensajes (como cualquier otra), aunque esto no es muy habitual, si se envían mensajes que no son los manejados por el servicio del banco de mensajería estos se ven desde el visor de mensajes estándar. 

Sin embargo, todos los mensajes que se reciben desde las producciones cliente con objeto de replicación se ven desde la opción Banked Messages, el log de eventos también se replica y se ve desde la opción Banked Events.

Los mensajes que se ven desde la opción de mensajes almacenados (Banked Messages) tiene una visualización algo diferente a la habitual ya que, como se comentó anteriormente, no se dispone de la definición de las clases.



Como se ve en la imagen anterior los mensajes personalizados se presentan serializados. Además existe una columna Client que identifica el Servidor, la Instancia y el Namespace desde el que se envía el mensaje.

Los mensajes incorporados en el banco de mensajería se registran mediante la clase Ens.Enterprise.MsgBank.MessageHeader. Esta clase tiene las siguientes propiedades:
  •  MessageBodyClassName: Nombre de la clase que contiene el mensaje
  • MessageBodyId: Identificador del objeto que contiene el mensaje
  • ClientBodyClassName: Nombre de la clase cuerpo del mensaje en la producción original.
  • ClientBodyId: Identificador del objeto que contiene el cuerpo del mensaje en la producción original.
Siempre que el mensaje original sea personalizado, es decir, no se implemente con una clase del sistema (Ens o EnsLib) entonces MessageBodyClassName se establece a %Stream.GlobalCharacter y el mensaje se serializa en XML. 

Esto es una restricción ya que aunque la visualización es similar a la acostumbrada, la búsqueda de mensajes en función de su contenido se hace muy complicada y no puede hacerse directamente desde el visor de mensajes (a no ser que sean clases HL7).

Producción de Banco de Mensajería

La producción de banco de mensajería ya está construida, puede obtenerse desde la documentación y es una clase que hereda de Ens.Enterprise.MsgBank.Production.. 

A continuación se muestra una producción de ejemplo msgbank.prod.MsgBankProduction:



Como se puede comprobar la producción solo dispone de dos servicios. El servicio MsgBankService se encarga de recibir los mensajes enviados desde las producciones cliente. Escucha en el puerto 9192 por defecto. En este caso adicionalmente se ha establecido la clase msgbank.util.Helper como Bank Helper Class. Esta clase de ayuda es invocada cada vez que se recibe un mensaje y trata el mensaje en el método OnBankMsg.

ClassMethod OnBankMsg(pHeader As Ens.Enterprise.MsgBank.MessageHeader,
                      …) As %Status
{
 if (pHeader.ClientBodyClassName="test.msg.TestMessage") {
   set bodyId = pHeader.MessageBodyId
   set pStream = ##class(%Stream.GlobalCharacter).%OpenId(bodyId)
   do ##class(msgbank.util.TestSearchTable).IndexDoc(pStream)
 }
 quit $$$OK
}

En este método recibimos el objeto de tipo MsgBank.MessageHeader que ha sido almacenado y podemos realizar acciones adicionales sobre el mismo. Por ejemplo podemos realizar la indexación del mismo mediante una clase tabla de búsqueda.

La tabla de búsqueda realiza la indexación sobre un tipo especifico de objetos. En este caso es necesario implementar una clase tabla de búsqueda sobre objetos de tipo %Stream.GlobalCharacter, sin embargo el stream contendrá un XML diferente en función del ClientBodyClassName que se esté almacenando. De esta forma será necesario implementar una tabla de búsqueda diferente para cada tipo de mensaje que queramos.

Producción Cliente

La producción cliente tan solo debe añadir una operación de negocio de tipo Ens.Enterprise.MsgBankOperation y establecer la IP y puerto del servicio de banco de mensajería. Adicionalmente hay que establecer la propiedad Enable Archiving para que los mensajes puedan ser reenviados a la producción del banco de mensajería.


Para facilitar la compresión de las explicaciones he construido dos producciones como ejemplo del banco de mensajería.
  • Una producción cliente sencilla de ejemplo que simplemente coge un fichero en un formato determinado, genera un mensaje, este mensaje pasa del servicio al proceso y del proceso a la operación (Descargar). También añado un sencillo fichero de entrada de ejemplo (Descargar).
  • La otra producción es la del banco de mensajería que almacena los mensajes reenviados desde la producción original. En esta producción se utiliza una clase de ayuda y una clase de tabla de búsqueda personalizada para el caso del mensaje especifico de la producción ejemplo (Descargar).
La producción cliente se despliegue en un servidor/namespace.
La producción de banco de mensajería se despliega en otro namespace o en otro servidor/namespace

En el namespace de banco de mensajería podrás ver todos los mensajes de la producción cliente y además podrás utilizar la tabla de búsqueda desde el visor de mensajes almacenados.

Espero que sea de utilidad