Comment charger des données statiques dans Mirth, éviter de nombreux allers-retours à une base de données

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

  •  18-09-2019
  •  | 
  •  

Question

Mirth est un courtier pour aider à l'intégration des messages HL7 application de soins de santé.

Ma question est de vous sauver la peine de frapper votre propre datastore chaque fois que vous voulez faire une recherche sur certaines données contenues dans le HL7.

Scénario: pour chaque message reçu par le canal, je veux trouver mnémotechnique / code / ID de l'installation et obtenir le nom complet de l'installation. Malheureusement, je ne peux pas demander à l'expéditeur du message HL7 pour l'envoyer le long dans le message pour moi. Donc, je dois écrire mon propre code d'accès de DB pour appeler une procédure stockée, passer dans l'ID, et recevoir le nom complet.

Toute idée sur la façon de créer un cache de données dans Mirth afin que vous puissiez accéder à la recherche d'un canal, source, destination, transformateur ou filtrer?

Était-ce utile?

La solution

Vous pouvez essayer d'écrire un script global avec deux fonctions:

1) Peupler un hastable Java ou construction similaire avec les données que vous recherchez

2) Utilisez le paramètre que vous passez comme la clé de la table de hachage et renvoyer les données contenues dans la table de hachage correspondant à cette touche.

Lien vers l'utilisation de Java dans Mirth ( lien )

Autres conseils

Dans notre cas, où nous avons dû charger des valeurs de recherche à partir d'une base de données, nous avons résolu cela comme suit:

  1. Avoir un script de déploiement de canal qui charge des valeurs de recherche lorsque le canal est déployé dans la carte mondiale.
  2. Avoir une fonction de modèle global qui vous permet de rechercher des valeurs de cette carte globale.
  3. Utilisez la fonction de modèle global dans les filtres et traduit.

Remarque: Dans notre cas, chaque clé pourrait avoir deux valeurs qui y sont associées. Si nous n'avons pas utilisé à la fois que nous venons de mettre la deuxième null dans la requête de la base de données.

Pour charger le lieu de carte du monde dans votre script de déploiement de votre canal (personnaliser selon les besoins):

// 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;

Pour accéder à ces valeurs que vous utilisez la fonction suivante en tant que modèle 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;
    }

Un échantillon de code pour accéder aux valeurs:

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

if ( myObject != null )
{

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

Votre kilométrage peut varier ... mais cela a fonctionné pour nous jusqu'à présent.

Merci, Frans de Wet

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top