Как загрузить статические данные в Mirth, избежать многократных обращений к базе данных - PullRequest
4 голосов
/ 28 апреля 2009

Mirth - это брокер, помогающий с интеграцией сообщений HL7 приложения здравоохранения.

Мой вопрос заключается в том, чтобы избавить себя от необходимости заходить в свое собственное хранилище данных каждый раз, когда вы хотите просмотреть некоторые данные, содержащиеся в HL7.

Сценарий: для каждого сообщения, полученного каналом, я хочу найти мнемонику / код / ​​идентификатор объекта и получить полное название объекта. К сожалению, я не могу попросить отправителя сообщения HL7 отправить его вместе со мной в сообщении. Поэтому мне нужно написать собственный код доступа к БД для вызова хранимой процедуры, передачи идентификатора и получения полного имени.

Есть идеи, как создать кеш данных в Mirth, чтобы вы могли получить доступ к поиску из любого канала, источника, места назначения, преобразователя или фильтра?

Ответы [ 2 ]

6 голосов
/ 12 января 2011

В нашем случае, когда нам нужно было загрузить значения поиска из базы данных, мы решили это следующим образом:

  1. Наличие сценария развертывания канала, который загружает значения поиска при развертывании канала в глобальной карте.
  2. Иметь глобальную функцию шаблона, которая позволяет вам искать значения из этой глобальной карты.
  3. Использование функции глобального шаблона в фильтрах и переводах.

Примечание. В нашем случае с каждым ключом могут быть связаны два значения. Если мы не использовали оба из них, мы просто устанавливаем значение null в запросе из базы данных.

Чтобы загрузить глобальную карту, поместите ее в сценарий развертывания своего канала (настройте по необходимости):

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

Для доступа к этим значениям вы используете следующую функцию в качестве глобального шаблона.

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

Пример кода для доступа к значениям:

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

if ( myObject != null )
{

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

Ваш пробег может варьироваться ... но это работало для нас до сих пор.

Спасибо, Франс де Мок

2 голосов
/ 30 мая 2009

Вы можете попробовать написать глобальный скрипт с двумя функциями:

1) Заполните хастабильную или похожую конструкцию Java данными, которые вы ищете

2) Используйте параметр, который вы передаете в качестве ключа к хеш-таблице, и верните данные, содержащиеся в хеш-таблице, соответствующие этому ключу.

Ссылка на использование Java в Mirth ( ссылка )

...