Как загрузить статические данные в Mirth, избегая многочисленных переходов к базе данных
Вопрос
Веселье это брокер, помогающий с интеграцией сообщений HL7 в медицинские приложения.
Мой вопрос заключается в том, чтобы избавить себя от необходимости обращаться к своему собственному хранилищу данных каждый раз, когда вы хотите выполнить поиск по некоторым данным, содержащимся в HL7.
Сценарий:для каждого сообщения, полученного каналом, я хочу найти мнемонический код / ID объекта и получить полное название объекта.К сожалению, я не могу попросить отправителя сообщения HL7 отправить его вместе с сообщением для меня.Поэтому я должен написать свой собственный код доступа к БД, чтобы вызвать хранимую процедуру, передать идентификатор и получить полное имя.
Есть идеи о том, как создать кэш данных в Mirth, чтобы вы могли получить доступ к поиску из любого канала, источника, назначения, преобразователя или фильтра?
Решение
Вы можете попробовать написать глобальный скрипт с двумя функциями:
1) Заполните hastable Java или аналогичную конструкцию данными, которые вы ищете.
2) Используйте параметр, который вы передаете, в качестве ключа к хеш-таблице и возвращайте данные, содержащиеся в хеш-таблице, соответствующие этому ключу.
Ссылка на использование Java в Mirth (связь)
Другие советы
В нашем случае, когда нам нужно было загрузить значения поиска из базы данных, мы решили это следующим образом:
- Имейте сценарий развертывания канала, который загружает значения поиска при развертывании канала на глобальной карте.
- У вас есть функция глобального шаблона, которая позволяет вам искать значения на этой глобальной карте.
- Используйте функцию глобального шаблона в filters and translates.
Примечание:В нашем случае каждый ключ может иметь два связанных с ним значения.Если мы не использовали оба варианта, мы просто присваиваем второму значение 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;
}
Ваш пробег может отличаться ...но до сих пор у нас это срабатывало.
Спасибо, Франс де Вет