jueves, 9 de junio de 2011

Gestión de Mensajería XML

En numerosas ocasiones es necesario manejar mensajes XML tanto de entrada como de salida así como transformar o manipular el contenido del mensaje.

Ensemble dispone de varias opciones para manejar XML y es importante conocerlas y saber interpretarlas ya que cada una de ellas tiene ventajas e inconvenientes y posiblemente la utilización de uno u otro método afecte al rendimiento del sistema, de manera que deberíamos saber escoger la mejor opción.

Aqui os dejo una presentación acerca de las diferentes opciones que hay:
Gestión de Mensajería XML así como algún código de ejemplo Código Fuente

lunes, 6 de junio de 2011

Aclarando el concepto "Tamaño de Grupo"

Hola,

En esta entrada voy a tratar de aclarar el concepto de "Tamaño de Grupo" o "Pool Size".

Para empezar es simple, cualquier elemento de la configuración de una producción ya sea un Business Service, Process u Operation tienen todos dentro de la parte de "Configuración General" un parámetro o setting denominado "Tamaño de Grupo". Este "setting" determina el número de "Jobs" o procesos de sistema operativo que se levantan para ese componente.

Por lo tanto podemos agrupar 3 casos diferentes:

1. "Pool Size" = 0
2. "Pool Size" = 1
3. "Pool Size" > 1

Para empezar tenemos que tener en cuenta que un componente que utilice un adaptador (es decir un Business Service o un Business Operation) deben tener siempre el "Pool Size" mayor que cero. Esto es porque si el "Pool Size" es igual a cero, simplemente no se levanta "Job" para ese elemento. Y en ese caso vamos a ver que el componente "no hace nada".

Por lo tanto todos los servicios y operaciones que utilicen adaptador deben tener tamaño de grupo mayor que cero.

Pero, entonces ¿Para qué sirve un PoolSize igual a cero en un Servicio?. Esta configuración es útil para por ejemplo disponer de servicios que son invocados directamente desde dentro de Ensemble como desde una aplicación compuesta, en ese caso utilizamos el mecanismo "CreateBusinessService" de la clase "Ens.Director":
Set tSC = ##class(Ens.Director).CreateBusinessService("MyService",.tService)
Y ¿Para qué es útil disponer de un servicio u operación con un tamaño de grupo mayor que uno?. Pues para mejorar la tasa de procesamiento de ese elemento. Esta claro que dos hacen más que uno. ¿no?.

De manera que si disponemos de una operación que, por ejemplo, envía mensajes HL7 hacia un destino externo y doblamos su tamaño de grupo entonces ¿esta irá el doble de rapido?. Pues sí siempre y cuando la configuración Hardware de la CPU permita trabajar a esos procesos en paralelo (por ejemplo en cores diferentes) con esto quiero decir que si solo disponemos de una CPU aunque dupliquemos el número de procesos no vamos a ver mejora, e incluso podemos ver como el rendimiento empeora.

Ádemas tenemos que tener en cuenta que con un tamaño de grupo mayor que uno (es decir con varios procesos trabajando simultaneamente en paralelo) el ordén FIFO no se respeta. Dos mensajes en secuencia pueden llegar a su destino final en desorden ya que son procesados en paralelo y terminar el segundo antes que el primero. Esto puede ser un problema dependiendo del entorno así que si queremos respetar el orden FIFO entonces el PoolSize siempre debe ser igual a uno.

Y ¿qué pasa con los Business Process?. Pues pasa lo mismo cuando el PoolSize es igual o mayor que uno. Pero cuando PoolSize es igual a cero entonces el comportamiento es un poco diferente. En el caso de que el PoolSize de un proceso sea igual a cero entonces efectivamente no se levanta Job para él sino que el proceso que lo ejecutará será el proceso especial "Ens.Actor".

"Ens.Actor" es un Job que se levanta automáticamente al iniciarse la producción y es un proceso de sistema operativo de uso "comunitario". Es decir, si disponemos de 10 BPL en una producción y todos disponen de PoolSize = 0 entonces esos 10 BPL estarán siendo ejecutados por el proceso físico Ens.Actor. Es decir el procesamiento de esos BPL es compartido por el mismo proceso. Esto quiere decir que nunca se procesan mensajes en paralelo para esos 10 BPL. ¿Nunca? no exactamente, porque depende del número de "Ens.Actor" que esten levantados y eso lo podemos configurar. Es un setting a nivel de producción denominado "Actor Pool Size" o "Tamaño de grupo de Actores".

Si establecemos "Actor Pool Size" a dos entonces veremos en la lista de Jobs exactamente dos procesos "Ens.Actor". En este caso el rendimiento será el doble. En este caso ocurre como anteriormente, un Ens.Actor alto solo puede ser útil en configuraciones HW que lo soporten.

Bueno pues después de todo esto podemos hacer este resumen:

1. "Pool Size" = 0
Util para BS que sean invocados directamente
Util para BP que comparten tiempo de procesamiento mediante "Ens.Actor"
2. "Pool Size" = 1
Respeta FIFO y es lo recomendable para BS, BP y BO
3. "Pool Size" > 1
Puede mejorar el rendimiento pero no respeta FIFO

Por último os remito a la documentación donde se explica todo esto:

Saludos

viernes, 3 de junio de 2011

Academia de Ensemble 2011 - Parte 8

Aqui os dejo el paso 8 de la academia (que además es el último)

En este paso mostramos algunas nuevas funcionalidades que nos ayudan a monitorizar las producciones como la generación de alertas por tiempo de espera en la cola.

Academia de Ensemble 2011 - Parte 7

Aqui os paso el paso 7 de la academia

En este paso terminamos de configurar el Business Service y el Business Operation que se encargan de recibir y enviar mensajes HL7. Luego hacemos algunas pruebas para comprender su funcionamiento y poder hacer seguimiento de lo que ocurre.

Academia de Ensemble 2011 - Parte 6

Aqui os dejo el paso 6 de la academia

En este paso vamos crear un regla de enrutamiento que nos permitirá ver como funciona el nuevo editor visual de reglas de enrutamiento del portal de gestión.

Academia de Ensemble 2011 - Parte 5

Aqui os dejo el paso 5 de la academia

En esta ocasión vamos a crear una transformación para convertir el mensaje HL7 que nos llega en el mensaje necesario que espera el BO de búsqueda de pacientes.

Es una transformación muy sencilla pero nos sirve para empezar a jugar con el editor visual de DTL desde el portal de gestión

Academia de Ensemble 2011 - Parte 4

Aqui os dejo el paso 4 de la academia

En esta ocasión se trata de añadir y modificar un Business Process basado en BPL que previamente hemos construido. De hecho ya lo importasteis en el paso anterior.

Es importante señalar que el BPL conecta con los diferentes BO en función de su nombre de configuración, de manera que para que las líneas de conexión aparezcan correctamente los BO se deben llamar exactamente como aparecen en el video (el único que hemos añadido en el paso anterior se debe llamar "BuscarPacientes" las mayúsculas y minúsculas son importantes).

Academia de Ensemble 2011 - Parte 3

Aqui esta el paso 3 de la academia

En este paso el objetivo es añadir y probar un nuevo Business Operation a la producción. Este Business Operation ya esta implementado y será necesario importarlo y compilarlo antes de poder agregarlo a la producción. El fichero que es necesario importar así como algunos ficheros más que se utilizarán en pasos posteriores están disponibles en este link:

Recursos de la academia

El fichero de recursos esta comprimido con RAR, dentro hay dos directorios. En el directorio "Academia" podemos encontrar una base de datos Access para hacer pruebas. Para poder seguir los pasos del video será necesario crear un DSN ya que en la producción se realiza una configuración para conexión por ODBC.

Es facil si tienes algo de experiencia utilizar otra base de datos externa para hacer tus pruebas, solo tienes que modificar los parámetros de conexión y reconstruir las sentencias SQL necesarias, aunque esta tarea se deberá hacer desde el Studio.

Academia de Ensemble 2011 - Parte 2

Aqui esta el paso 2 de la academia.

En este ocasión en el video veremos un paso a paso para realizar la creación de una producción básica de gestión de mensajería HL7. Posteriormente en los siguientes pasos utilizaremos esta producción quitando, añadiendo y configurando componentes.

Atención si seguis el video tened en cuenta que a la hora de crear la producción el nombre del paquete "academia" va en minúsculas. Si no lo hacéis así en pasos posteriores os dará problemas ya que tendréis que importar clases en ese paquete (que debe tener exactamente ese nombre).


jueves, 2 de junio de 2011

Academia de Ensemble 2011 - Parte 1

Aqui está el primer video de la academia de Ensemble del pasado Simposio de InterSystems 2011 que tuvo lugar en Valencia (25 y 26 de Mayo).

Para entender los objetivos de la academia podeis ver la presentación inicial

Descarga la presentación en PDF

Si seguis el video tened en cuenta que esta academia esta presentada con una versión preliminar de la futura 2011.1 que aún no está liberada. Lo hicimos así para que pudierais comenzar a familiarizaros con el nuevo interfaz.


miércoles, 1 de junio de 2011

Como saber si un servicio esta habilitado programaticamente

En ocasiones nos puede interesar consultar mediante código si un servicio determinado está o no habilitado.


Para eso he implementado este método de clase que puedes agregar a tu clase o a otra más general de la que heredar, y luego invocarlo según interese:


ClassMethod IsServiceEnabled() as %Boolean

{

#dim tSC as %Status

#dim productionName as %String

#dim productionStatus as %Integer

set tSC= ##class(Ens.Director).GetProductionStatus(.productionName,.productionStatus)

#dim config as Ens.Config.Production

set config = ##class(Ens.Config.Production).%OpenId(productionName)

#dim item as Ens.Config.Item

set item=config.FindItemByConfigName(..%ClassName(1))

quit item.Enabled

}

Transformaciones en campos HL7 de más de 32KB

Una cuestión importante sobre mensajería HL7 codificada en ER7 en Ensemble.

Si tienes mensajes con campos de más de 32 Kb (por ejemplo un mensaje con un OBX de radiología que tenga un texto de más de 32 KB) y realizas una manipulación directa de ese campo desde un DTL (una manipulación puede ser una copia directa cuando transformas de XML a ER7). Entonces EL VALOR SE TRUNCA A 32 KB.

Para hacerlo correctamente hay que hacerlo de una manera especial:

For DTL's that provide transformation on segments with fields > 32k, there are some different things that need to be done. For the purpose of my explanation, lets assume my OBX:5 field is > 32K.

Basically, if you have a DTL that makes no changes to any part of the OBX segment, and are using a copy, there is nothing different you need to do. If you are adjusting a field (the most likely case) we will need to use some stream manipulation.

What happens is that Ensemble stores segment data in 32k chunks internally. While providing the string value, it returns only the contents of the first chunk. This will also occur even if the long strings are enabled.

To get around this, you need to use the ReadRawDataStream and StoreRawDataStream of the EnsLib.HL7.Segment class.

The behavior of ReadRawDataStream is

0) If you do not specify a property path the whole of the segment is returned

1) If the field you want is < 32K, you just get that field

2) If the field you want is >32K, you get from that field to the end of the segment.

3) If the field you want is after the 32K field you get nothing returned. ReadRawDataStream was intended for use when the final field of the segment was greater than 32k.

I've included a sample below. In this case, I want to manipulate a field prior

to 5 (the > than 32)










If you want to manipulate 5 or a field after it, you would have to use standard stream manipulation.

The test transformation is studio does also have a 32K limit, but that is not related to what is actually happening when the message passes through.

Saludos