La forma de cargar los datos estáticos en la alegría, evitar muchos de ida y vuelta a una base de datos

StackOverflow https://stackoverflow.com/questions/795462

  •  18-09-2019
  •  | 
  •  

Pregunta

la alegría es un intermediario para ayudar con la integración de mensajes HL7 aplicación de la asistencia sanitaria.

Mi pregunta es sobre ahorrándose la molestia de golpear a su propio almacén de datos cada vez que desea hacer una búsqueda en algunos datos contenidos en el HL7.

Escenario: por cada mensaje recibido por el canal, quiero encontrar la instalación de mnemotécnica / código / Identificación y obtener el nombre completo de la instalación. Lamentablemente no puedo pedir al remitente del mensaje HL7 para enviarlo junto en el mensaje para mí. Así que tengo que escribir mi propio código de acceso DB para llamar a un procedimiento almacenado, pasar el ID y recibirá el nombre completo.

Cualquier idea sobre cómo crear una caché de datos en la alegría, para que pueda acceder a la búsqueda de cualquier canal, origen, destino, el transformador o filtro?

¿Fue útil?

Solución

Se podría tratar de escribir un guión global con dos funciones:

1) Llenar una hastable Java o construcción similar con los datos que busca

2) Utilice el parámetro que se pasa en como la clave para la tabla hash y devolver los datos contenidos en la tabla hash correspondiente a esta clave.

Enlace a usar Java en la alegría ( enlace )

Otros consejos

En nuestro caso, donde tuvimos que cargar valores de búsqueda de una base de datos, hemos resuelto de la siguiente manera:

  1. Tener una secuencia de comandos de despliegue de canales que carga valores de búsqueda cuando el canal se despliega en el mapa global.
  2. Tener una función plantilla global que permite a las operaciones de búsqueda de los valores de este mapa mundial.
  3. Utilice la función de plantilla global en filtros y traduce.

Nota: En nuestro caso, cada tecla puede tener dos valores asociados a ella. Si no usamos tanto acabamos de fijar el segundo en nulo en la consulta de la base de datos.

Para cargar el lugar mapa global esta en el script de despliegue de su canal (personalizar según sea necesario):

// This script executes once when the mule engine is started
// You only have access to the globalMap here to persist data 

var sqlDBDriver   = 'net.sourceforge.jtds.jdbc.Driver';
var sqlDBName     = 'jdbc:jtds:sqlserver://databaseserver/databasename';
var sqlDBDUser    = 'username';
var sqlDBPassword = 'password';

function PopulateLookup ( sqlQuery, globalMapName )
{
    logger.info('Loading lookup table values in the deploy script: ' + globalMapName);

    var dbConn = DatabaseConnectionFactory.createDatabaseConnection( sqlDBDriver, sqlDBName, sqlDBDUser, sqlDBPassword );
    var rs = dbConn.executeCachedQuery( sqlQuery );
    dbConn.close();

    var arr = new Array();
    while(rs.next())
    {
        var obj = new Object();
        obj.LeftValue   = rs.getString('LeftValue');
        obj.RightValue1 = rs.getString('RightValue1');
        obj.RightValue2   = rs.getString('RightValue2');
        arr.push(obj);
    } 
    globalMap.put( globalMapName, arr );
}

PopulateLookup( 'SELECT keyColumn as LeftValue, Value1 as RightValue1, Value2 as RightValue2 FROM tableName', 'GlobalMapName' );

// Repeat above line as needed for each lookup you need

return;

Con el fin de acceder a estos valores que utiliza la siguiente función como una plantilla global.

function FindLookupValueWithDefault ( LookupGlobalMapName, LeftValue, DefaultValue1, DefaultValue2 ){
    /***********************************************************************************************
    DESCRIPTION: Retrieves lookup table values from the global map and uses the input values to return output values

     PARAMETERS:
       LookupGlobalMapName - name of the lookup table in the Global Map
       LeftValue - The value to look up
       DefaultValue1 - the first default value if a match was not found
       DefaultValue2 - the second default value if a match was not found

    RETURNS:
       An object containing the replacement value and associated OID if applicable

    REMARKS: 
    ************************************************************************************************/
        // Retrieve the previously matched item from the globalmap
        //    We do this to save time and not look through a huge lookup table tons of times
        //    unless we absolutely have to
        var prevItem = globalMap.get(LookupGlobalMapName + '-Previous');

        // This is the same item requested for this globalmap name - just return the previous value
        if ( prevItem != null && prevItem.LeftValue == LeftValue) {
            return prevItem;
        }

        //
        // If we reach this point the previous item either did not exist or did not match 
        //

        // Retrieve the array with lookup objects from the globalmap and search for the matching value
        var arr = globalMap.get(LookupGlobalMapName);
        var obj = new Object();
        obj.LeftValue = LeftValue;
        obj.RightValue1 = DefaultValue1;
        obj.RightValue2   = DefaultValue2; 
        for each ( item in arr )
        {
            var pattern=new RegExp("^" + item.LeftValue + "$");
            var result = pattern.test(LeftValue );

            if ( pattern.test(LeftValue ) )
            {
                obj = item;
                break;
            } 
        }

        // Store the previous value in the globalmap
        globalMap.put( LookupGlobalMapName + '-Previous', obj );

        // Return the object we found or created
        return obj;
    }

Una muestra de código para acceder a los valores:

var myObject = FindLookupValueWithDefault('GlobalMapName', 'LookupValue', 'DefaultValue1', 'DefaultValue2');

if ( myObject != null )
{

      var value1 = myObject.RightValue1;
      var value2 = myObject.RightValue2;
}

Su kilometraje puede variar ... pero esto nos ha funcionado hasta ahora.

Gracias, Frans de Wet

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top