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.
- 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