2009-04-27 8 views
3

Mirth est un courtier pour aider à l'intégration des messages d'application de soins de santé HL7.Comment charger des données statiques dans Mirth, éviter de nombreux roundtrips à une base de données

Ma question est de vous épargner la peine de frapper votre propre banque de données 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 souhaite trouver la mnémonique/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 de l'envoyer dans le message pour moi. Je dois donc écrire mon propre code d'accès DB pour appeler une procédure stockée, transmettre l'ID et recevoir le nom complet.

Une idée sur la façon de créer un cache de données dans Mirth afin que vous puissiez accéder à la recherche à partir de n'importe quel canal, source, destination, transformateur ou filtre?

Répondre

2

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

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

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

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

+0

Merci Jason; En fait, j'ai beaucoup appris de votre blog. Bravo pour l'affichage du how-to! J'ai la mise en œuvre, que je vais poster dans la question quand je peux. Merci encore! –

+0

Content de vous aider - je serai intéressé d'entendre si la solution a fonctionné! –

5

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. un script de déploiement de canal charge les valeurs de recherche lorsque le canal est déployé dans la carte globale.
  2. Avoir une fonction de modèle global qui vous permet de rechercher des valeurs à partir de cette carte globale.
  3. Utilisez la fonction de modèle global dans les filtres et traduit.

Remarque: Dans notre cas, deux valeurs peuvent être associées à chaque clé. Si nous n'utilisons pas les deux, nous mettons juste la seconde à 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 exemple 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

Questions connexes