샘플 맵은 다양한 브로커링 시나리오를 구현하는 설계 패턴을 보여줍니다. 메시지 맵 도구 설계를 사용하여 설계 패턴을 복합 패턴으로 함께 결합할 수 있습니다. 이렇게 하면 더 간단한 시나리오의 설계 패턴을 함께 어셈블하여 복합 시나리오의 메시지 맵을 작성할 수 있습니다. 샘플 파일은 전개가 가능하도록 설계되지 않았습니다.
전체 메시지 어셈블리 처리를 위한 샘플 파일은 메시지 맵 샘플 메시지 플로우 프로젝트의 message_assembly 폴더에 있습니다.
메시지 어셈블리는 메시지의 모든 헤더와 본문 또는 페이로드(payload)의 조합니다. 메시지 플로우의 Mapping, DataInsert, DataUpdate, DataDelete 및 Extract 노드는 항상 전체 메시지 어셈블리를 처리합니다. 이는 이와 같은 노드의 맵핑이 항상 메시지 어셈블리 모델을 맵의 소스 및 대상으로 표시함을 의미합니다.
WebSphere Message Broker에는 두 가지의 메시지 어셈블리 모델인 단순 등록 정보 모델과 전체 헤더 모델이 있습니다. 어느 것을 선택할 지는 사용자의 시나리오 요구사항과 일치하는 모델을 선택하는 데 따라 달라집니다. 왼쪽 그림은 메시지 어셈블리의 등록 정보 모델을 표시하고 오른쪽 그림은 헤더 메시지 어셈블리 모델을 표시합니다.
WebSphere Message Broker 메시지 어셈블리에는 그림에 번호가 매겨진 네 개의 항목이 포함되어 있습니다.
맵핑 노드 중 하나 다음에 Route To Label 건너뛰기를 수행하도록 메시지 플로우를 구성할 수 있습니다. 이는 플로우 내 컨텐츠 기반 라우팅 시나리오에서 유용합니다.
이 샘플에서는 세 가지의 공통 시나리오가 구현됩니다.
모든 경우에서 메시지의 본문 또는 페이로드(payload)가 메시지 어셈블리의 마지막 항목으로 제공됩니다.
맵핑 노드 다음에 메시지 라우팅을 제어하려면 메시지 어셈블리
labelName
요소를 사용하십시오. 이는 다음 메시지 플로우 노드를
선택하여 맵을 통한 처리를 계속하려는 시나리오에서 유용합니다.
다음 그림은 Mapping 노드, Route To Label 노드 및 몇몇 목적지 Label 노드로 구성된 샘플 메시지 플로우 파일 RouteToLabelUsingMap.msgflow를 보여줍니다. Label
노드의 대상 목적지 레이블은 이름과 같도록 구성됩니다.
출력 메시지를 처리하는 Label 노드를 선택하려면
맵이 Label 노드 레이블 이름 등록 정보를 지정해야 합니다. 샘플 맵 파일 SetLabelNodeLabelName.msgmap은
두 개의 condition
과 하나의 else
가 있는 if
행을 사용하여 이를 처리합니다.
이 샘플은 다음과 같습니다.
$source/rtl:body/content
가 0인 모든 메시지는
Label 노드 Target1의 플로우 노드 다운스트림에 의해 처리됩니다. $source/rtl:body/content
가 0보다 큰 모든 메시지는
Label 노드 Target2의 플로우 노드 다운스트림에 의해 처리됩니다. 종종 맵은 독점적으로 메시지 본문에 초점을 맞춥니다. 이 시나리오에서는 모든 헤더가 변경되지 않고 맵에 의해 복사됩니다.
변경되지 않은 모든 헤더를 복사하려면 등록 정보 모델을 사용하십시오. 단순화된 등록 정보 메시지 어셈블리 모델을 선택할 경우에는 등록 정보 폴더를 제외한 모든 메시지 헤더가 순서대로 변경되지 않고 복사됩니다.
등록 정보 메시지 맵을 작성하면 $source/Properties
복합 요소를
$target/Properties
복합 요소에 맵핑하십시오. 그러면 등록 정보 폴더가 다른 변경되지 않은
모든 헤더와 함께 변경되지 않은 상태로 소스에서 대상으로 복사됩니다.
아래의 이미지는 모든 헤더(등록 정보 포함)가 변경되지 않고 복사되도록 구성된 샘플 파일 CopyAllHeaders.msgmap를 보여줍니다.
Properties 모델을 사용하면 복잡하게 여러 헤더를 처리하지 않고도 많은 브로커 시나리오를 사용할 수 있습니다. Properties는 MQ Series 및 MRM 구문 분석기에 대해 중요한 대부분의 헤더 속성을 추출하여 단일 패키지로 표시합니다. 모든 헤더 복사 시나리오 외에도, MQ Series가 전송 계층이고 MRM이 메시지 본문 구문 분석기인 상황에서 Properties 모델을 사용하십시오. 속성은 다음과 같은 범주로 분류할 수 있습니다.
유의해야 할 점은 Properties
모델의 모든 필드를
설정해야 하는 것입니다. MessageFormat
과 같은 단일
필드를 설정하여 출력 메시지 Wire 형식을 선택해야 할 경우,
Properties
폴더에서 다른 값도 설정하거나 복사하십시오. 명시적으로
설정되지 않은 필드는 출력 메시지에 복사되지 않습니다.
Headers
모델은 등록 정보 외에 선택된 헤더를
맵핑할 수 있는 기능을 제공합니다. Headers
모델은
"모든 헤더 복사" 기능을 지원하지 않습니다. 명시적으로 맵핑되지 않는 헤더는 대상의 부분으로 작성되지 않습니다.
헤더는 MQMD, MQ, HTTP 및 JMS 헤더로 분류됩니다. JMS, JMS를 통한 SOAP
및 HTTP 시나리오의 경우 Headers
모델을 사용하십시오. Properties
모델에서 필요한 제어를 제공하지 않을 경우에는 MQ 시나리오에 Headers
모델을 사용하십시오.
Compute
노드를 구성해야 합니다. Compute
노드를 구성해야 합니다. 다중 출력 메시지 시나리오를 위한 샘플 파일은 Message Map Sample Message Flows 프로젝트의 multiple_output 폴더에 있습니다.
여러 개의 출력 메시지를 작성하기 위한 기본 규칙은 여러 개의
$target
행을 묵시적이나 명시적으로 선언하는 것입니다. for
행을 사용하여 여러 개의 행을 묵시적으로
선언할 수 있습니다. for
행을 사용하면 0개 이상의
출력 메시지가 작성됩니다(for
행 소스로 제공되는
소스 항목당 하나씩). 또한 소스 및 대상 추가 메뉴를 사용하여
둘 이상의 대상을 명시적으로 추가함으로써 여러 개의 출력 메시지를 작성할 수 있습니다. 각각의
대상은 하나의 출력 메시지를 작성합니다. 소스의 각 항목이 자체적으로 여러 개의 출력 메시지를
작성할 경우에는 for
행을 여러 개의 대상과 결합할 수도 있습니다.
메시지 맵이 여러 개의 메시지를 출력하도록 구성하는 데 유용한 몇 가지의 시나리오가 있습니다. 일부 시나리오는 다음과 같습니다.
이 시나리오에서는 단일 메시지가 다른 엔터프라이즈 정보 시스템을 대상으로하여 다른 메시지로 변환되거나 개별적으로 최상으로 처리되는 여러 개의 반복 필드를 포함합니다.
멀티파트 메시지는 다른 Wire 형식의 메시지나 다른 사전이 단일 배치 메시지로 결합될 수 있도록 하는 브로커 멀티파트 메시지 기능을 사용하여 모델화된 메시지입니다.
소스 메시지에는 여러 개의 EIS 시스템마다 별도의 메시지로 변환해야 하는 데이터가 있습니다. 반복되지 않는 개별적인 필드는 결합하여 여러 개의 출력 메시지를 작성해야 합니다.
소스 메시지에는 필드의 값(예: 거래 파트너 ID)을 기초로 여러 개의 출력 메시지로 변환해야 하는 반복 필드(예: 송장(invoice))가 있습니다.
메시지 맵 도구를 사용하면 여러 개의 출력 메시지를 쉽게 생성할 수 있습니다. 단지 for
행에서 대상 메시지 어셈블리를 인클로즈하거나
여러 개의 대상 메시지 어셈블리를 지정하면 됩니다.
이 시나리오의 샘플 파일은 Message Map Sample Message Flows 프로젝트의 multiple_output 폴더에 있습니다.
반복하는 소스 필드의 여러 출력 메시지를 작성하기 위해 필요한 조치는
for
행에서 반복 소스에 대해 작동하는 대상 메시지
어셈블리를 엔클로즈하는 것이 전부입니다.
샘플 메시지 맵 repeating_source.msgmap는
소스 메시지 어셈블리의 반복 필드를 호출하는 메시지 플로우에서
메시지 어셈블리 스트림으로 변환합니다. repeating_source.msgmap는
for
행에서 $target
행을 랩핑하여
여러 개의 출력 메시지 어셈블리를 작성합니다(반복되는 입력마다 하나씩). 어셈블리마다
등록 정보 폴더가 복사됩니다. 즉, 모든 헤더 복사 작동이
사용됩니다. 그런 다음 각각의 출력 메시지 어셈블리에서
단일 rtl:body
가 복사됩니다.
이 시나리오의 샘플 파일은 Message Map Sample Message Flows 프로젝트의 multipart_messages 폴더에 있습니다.
반복 필드에서와 같이, 반복되는 멀티파트 소스 메시지에 대해
여러 개의 출력 메시지를 작성하기 위해 필요한 조치는
for
행에서 반복되는 멀티파트 메시지 정의에 대해 작동하는
대상 메시지 어셈블리를 엔클로즈하는 것이 전부입니다.
멀티파트 메시지와 일반적인 반복 필드 사이의 주요 차이점은,
멀티파트 메시지는 open
또는 open-defined
컨텐츠
모델을 사용하여 로컬 컨텐츠 그룹으로 정의(XML 스키마로의 브로커 확장)되는 반면 반복 필드는
요소로 정의된다는 점입니다.
멀티파트 메시지에서 다른 메시지 맵 구조체를 도입하기 보다는, 컨텐츠가 XML 스키마 와일드카드인 경우와 같이 컨텐츠 그룹이 처리됩니다. XML 스키마 와일드카드 요소의 맵을 작성할 경우 호출된 서브맵을 사용해야 합니다.
샘플에 표시된 것처럼, 와일드카드 요소는 요소 특정의 서브맵을 사용하여 맵핑됩니다. 실제로 와일드카드나 "unknown" 요소는 서브맵 호출에 의해 "known" 요소로 변환됩니다.
이 시나리오의 샘플 파일은 Message Map Sample Message Flows 프로젝트의 multiple_output 폴더에 있는 nonrepeating_source.msgmap에 있습니다.
여러 메시지를 생성하는 기술은 소스의 반복 여부에 관계없이
동일합니다. 이 경우, 맵에 의해 여러 개의
$target
행이 명시적으로 선언됩니다. 선언된 각
대상 행은 하나의 출력 메시지를 작성합니다. 반복 시나리오에서는
대상 어셈블리를 포함하는 for
행으로
여러 개의 어셈블리가 묵시적으로 선언되고 for
에서
항목마다 하나의 출력 어셈블리가 작성되었습니다.
이 시나리오의 샘플 파일은 Message Map Sample Message Flows 프로젝트의 sorting 폴더에 있습니다. 테마는 두 가지로 변형할 수 있습니다.
맵 작성 시 정렬 키 값을 알 수 있을 경우의 정렬 및 그룹화는 파일 sorting.msgmap에 설명되어 있습니다. 세 가지의 가능한 필드 값이 반복되지 않는 입력의 다중 출력 메시지 작성 설계 패턴을 사용하여 세 가지의 개별 메시지로 정렬됩니다.
단일 메시지를 여러 개의 메시지로 변환한 후에는 자주 레코드 수와 총계를 계산해야 합니다. 이 계산은 total.msgmap 파일에서 두 번째 단계로 처리해야 합니다. 메시지 플로우 sort.msgflow는 결과를 얻기 위해 두 개의 맵핑 노드를 연결하는 방법을 설명합니다.
샘플 파일은 sorting_dynamic.msgmap입니다. 이 샘플은 미리 알려진 키로 정렬과 아주 유사하지만 결정적인 차이점은 올바른 키 목록을 얻기 위해서는 맵이 데이터베이스로 이동해야 한다는 것입니다. 맵의 단계는 다음과 같습니다.
$db:select
행을 사용하여
데이터베이스에서 키 목록을 확보합니다. for
행은 $db:select
를 통해
각각의 항목을 차례로 처리합니다. for
행에 다른
for
행이 중첩되어 있으면 소스에서 각 레코드를
차례로 선택합니다. if
행 및 condition
행은 두 개의 for
행을 필터하여,
키가 일치하는 행만 출력 메시지를 생성하도록 합니다. $target
행이 출력
메시지를 작성합니다(데이터베이스와 소스 메시지 둘 다에 있는
고유 키 값마다 하나씩).이전 예와 같이, 올바른 출력 메시지를 갖도록 하는 것으로는 충분하지 않으므로 다시 total.msgmap 맵을 호출하여 출력 메시지마다 총계를 계산해야 합니다.
샘플 파일은 Message Map Sample Message Flows 프로젝트의 esql_calling_msgmap 폴더에 있습니다.
샘플은 ESQL에서 맵을 호출하는 방법을 보여줍니다. 사용자가
기본 맵보다는 서브맵을 호출할 것으로 예상합니다. 서브맵은 다른 맵이나 ESQL에서 호출되도록 할
메시지 맵입니다. 이 맵은 다른 맵에서 호출될 수 있으며... 단일 선택 단추를 선택하여
새 메시지 맵 마법사(파일>새로 작성>메시지 맵
)에서
서브맵을 작성하십시오.
서브맵을 호출하기 위해 예상되는 ESQL 서명은 다음과 같습니다.
submapName( sourcePath1, [sourcePath2, [...]] [targetPath, ] InputLocalEnvironment [, OutputLocalEnvironment])
최소 하나의 sourcePath
매개변수가 항상 존재합니다. 이는 메시지 플로우 노드를 구동하는 메시징 입력을 표시합니다. sourcePath
는 메시지 맵을 호출하기 전에 소스 트리 노드를
참조하기 위해 초기화된 ESQL REFERENCE
변수입니다.
targetPath
는 대상 루트 트리 노드를 참조하는
선택적 ESQL REFERENCE
변수입니다. 메시지 맵을 호출하기 전에
초기화해야 합니다. targetPath
는
선택사항이지만 메시지 맵에 대상 매개변수가 없으면 맵이
어떤 메시징 출력도 작성하지 못합니다. 관계 데이터베이스 시나리오의
메시지에 사용되며, 여기에서 맵은 ESQL Database
노드에서 호출됩니다.
InputLocalEnvironament 및 OutputLocalEnvironment는 연관된 ESQL
노드 상관 이름에 대해 초기화된 ESQL REFERENCE
변수입니다. 메시지 맵은 스키마 범위 프로시저로 구현되므로 상관 이름에
직접 액세스할 수 없습니다.
샘플 코드는 필수 매개변수를 초기화하고 맵을 호출합니다.
샘플 파일은 Message Map Sample Message Flows 프로젝트의 esql_calling_msgmap 폴더에 있습니다.
맵을 호출하는 ESQL의 기본 패턴이 구현되었습니다. ESQL
MODULE
코드는 Properties
및 Headers
폴더를
초기화하고 필요한 참조를 작성하며 맵을 호출하기 위해 작성되었습니다.
맵은 모든 Aggregate
노드 폴더(Request1, Request2
등)에서 단일 출력 메시지를 구성합니다. ESQL MODULE
이 등록 정보와 헤더를
처리했으므로, LocalEnvironment.Aggregate.AgregateRequestFolderName
의
컨텐츠를 출력 메시지에 복사만 하면 됩니다.
이 샘플 시나리오는 메시지 맵에서 와일드카드, 유형 확장 및 제한, 대체 그룹 및 컨텐츠 모델 그룹을 사용하는 XML 스키마 모델을 변환하기 위한 설계 패턴을 보여줍니다.
와일드카드 요소 및 속성을 처리하기 위한 샘플 파일은 Message Map Sample Message Flows 프로젝트의 multipart_messages 폴더에 있습니다.
와일드카드 요소는 서브맵을 호출하여 처리합니다. 서브맵에서는
요소의 이름이 하드코딩됩니다. 동일한 와일드카드를 통해 다른 요소 이름을
처리하려면 if
, condition
및 else
행을 사용하십시오.
샘플은 단순한 반복 필드 시나리오를 구현하지만 약간 복잡한 경우에는 반복하는 소스가 브로커 멀티파트 메시지로 모델화됩니다. 멀티파트 메시지는 맵 도구에 의해 와일드카드 요소로 처리됩니다. 와일드카드는 올바른 요소 이름의 서브맵을 호출하여 처리됩니다.
첫 번째 맵에서 대상 메시지 어셈블리는 for
행에
포함됩니다. for
행은 단일 소스 메시지에 의해
포함된 반복되는 멀티파트 메시지에 대해 작동합니다. for
행에 대상 어셈블리가 포함된다는 것은
전체 대상 메시지 어셈블리가 출력됨을 의미합니다(소스에 있는 입력 멀티파트
메시지마다 하나씩). 첫 번째 메시지 맵에는 멀티파트 메시지를 지원하는
와일드카드 메시지의 맵핑도 포함됩니다. 이 맵핑은
와일드카드가 표시하는 요소의 완료된 전체 정의를 리턴해야 하는 서브맵을
호출합니다.
두 번째 맵에서는 와일드카드 메시지 요소가
rtl:body
요소가 되도록 제한되었음을 알 수 있습니다. 이 서브맵에서는
소스와 대상이 동일하므로 소스를 복사(deep copy)하여 대상을 작성합니다.
이 시나리오의 샘플 파일은 Message Map Sample Message Flows 프로젝트의 xmlschema 폴더에 있는 type_to_substitutiongroup.msgmap입니다.
메시지 맵 편집기에서는 올바른 유형 조합을 표시하기 위해 특수한 소스 및 대상 트리 '폴더'가 사용됩니다. 폴더의 이름은 specializations for base type입니다. 폴더 내에는 추상이 아닌, 기본 유형으로부터의 모든 파생과 결합된 요소가 표시됩니다. 이와 같은 구체적 요소 표현에는 각각 전체 컨텐츠가 포함되므로 가능한 모든 속성 다음에는 모든 올바른 요소가 있습니다. 중요한 것은 트리가 XML 스키마 모델이 설명하는 다른 XML 요소를 표시한다는 것입니다.
샘플 메시지 맵에서, 소스는 대체로 extensionType1
및 extensionType2
를
허용하는 XML 스키마 모델을 사용하여 설명됩니다. 이 대체사항은 각각 개별적으로 대상에
맵핑될 수 있습니다.
샘플이 복잡하지 않아도 유형 확장 계층을 선택하는 모델, 대체 그룹 등과 결합할 수 있습니다.
이 시나리오의 샘플 파일은 Message Map Sample Message Flows 프로젝트의 xmlschema 폴더에 있는 type_to_substitutiongroup.msgmap입니다.
메시지 맵 편집기에서는 대체 그룹 조합을 사용하여 올바른 요소를 표시하기 위해 특수한 소스 및 대상 트리 '폴더'가 사용됩니다. 폴더의 이름은 head element를 대체합니다. 폴더 내에는 추상이 아닌, 기본 유형으로의 모든 파생과 결합된 다른 요소 이름이 표시됩니다. 이와 같은 구체적 요소 표현에는 각각 전체 컨텐츠가 포함되므로 가능한 모든 속성 다음에는 모든 올바른 요소가 있습니다. 중요한 것은 트리가 XML 스키마 모델이 설명하는 다른 XML 요소를 표시한다는 것입니다.
샘플 메시지 맵에서, 대상은 추상 HeadElement
요소에 대한 대체로
Substitute1
및 Substitute2
를 허용하는 XML 스키마 모델을
사용하여 설명됩니다. 이 대체사항은 각각 개별적으로 소스에 맵핑될 수 있습니다.
샘플이 이처럼 복잡하지 않아도 대체 그룹을 유형 계층과 결합할 수 있습니다.
이 시나리오의 샘플 파일은 >Message Map Sample Message Flows 프로젝트의 modelgroups 폴더에 있습니다.