MIRTH에 정적 데이터를로드하는 방법, 데이터베이스에 대한 많은 왕복을 피하십시오.

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

  •  18-09-2019
  •  | 
  •  

문제

환락 의료 응용 프로그램 HL7 메시지 통합을 돕는 중개인입니다.

내 질문은 HL7에 포함 된 일부 데이터를 조회하고 싶을 때마다 자신의 데이터 스토어를 때리는 데 어려움을 겪는 것입니다.

시나리오 : 채널에서받은 각 메시지에 대해 시설의 니모닉/코드/ID를 찾고 시설의 전체 이름을 얻고 싶습니다. 불행히도 나는 HL7 메시지 발신자에게 메시지를 보내달라고 요청할 수 없습니다. 저장된 절차를 호출하고 ID를 통과하고 전체 이름을 받으려면 내 DB 액세스 코드를 작성해야합니다.

모든 채널, 소스, 대상, 변압기 또는 필터에서 조회에 액세스 할 수 있도록 MIRTH에서 데이터 캐시를 만드는 방법에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

두 가지 기능으로 글로벌 스크립트를 작성해 볼 수 있습니다.

1) 원하는 데이터와 함께 자바 급히 또는 이와 유사한 구성을 채우십시오.

2) 전달한 매개 변수를 해시 테이블의 키로 사용 하고이 키에 해당하는 해시 테이블에 포함 된 데이터를 반환하십시오.

mirth에서 Java 사용에 대한 링크 (링크)

다른 팁

우리의 경우 데이터베이스에서 조회 값을로드 해야하는 경우 다음과 같이이를 해결했습니다.

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

당신의 마일리지는 다를 수 있습니다 ... 그러나 이것은 지금까지 우리에게 효과적이었습니다.

감사합니다, Frans de Wet

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top