IBM MQ 메시지 헤더 처리 방법

IBM MQ 메시지는 선택적으로 MQRFH2 헤더에 대한 추가 헤더 또는 대체 헤더를 포함할 수 있으며, 이것은 JMS 특성을 포함합니다. WebSphere® Application Server 애플리케이션 프로그램은 com.ibm.mq.headers 클래스를 사용하여 IBM MQ 의 메시지에 있는 헤더에 액세스하고 메시지의 헤더를 IBM MQ 로 구성할 수 있습니다.

IBM MQ 메시지 헤더

IBM MQ 메시지는 항상 메시지 디스크립터(MQMD)를 포함합니다. 또한 메시지에 관한 추가 정보를 포함하는 헤더를 포함할 수 있습니다. 예를 들어 JMS 애플리케이션으로(부터)의 메시지는 대개 메시지 특성을 포함하는 MQRFH2 헤더를 포함합니다. IBM MQ는 일부 헤더(예: MQRFH2)의 형식 및 사용법을 정의하며 사용자 및 써드파티 소프트웨어 제공자가 자신의 사용자 정의 헤더를 정의할 수 있게 허용합니다.

일반적으로는 애플리케이션 프로그램이 IBM MQ 메시지 헤더를 처리할 필요가 없습니다. 대부분의 IBM MQ 애플리케이션은 헤더를 전혀 사용하지 않거나 MQRFH2 헤더만 사용하며, 사용자가 이들 애플리케이션과 통신 중일 때 서비스 통합 및 IBM MQ 메시징 제공자가 자동으로 MQRFH2 헤더를 처리합니다. 그러나 추가 또는 다른 헤더를 사용하거나 작성하는 IBM MQ 애플리케이션과 통신 중인 경우, WebSphere Application Server 애플리케이션은 com.ibm.mq.headers 클래스를 사용하여 전송하는 메시지에 헤더를 작성하고 수신하는 메시지에서 처리합니다.

IBM MQ 메시지에서 헤더(헤더가 있는 경우)는 메시지의 시작에서 메시지 페이로드 앞에 있습니다. 각 헤더에는 다음 헤더 또는 추가 헤더가 없는 경우 페이로드를 설명하는 필드가 들어 있습니다. MQMD에는 첫 번째 헤더 또는 헤더가 없는 경우 페이로드를 설명하는 필드가 들어 있습니다. MQMD 및 MQRFH2 헤더는 일반적으로 JMS 메시지에 나타나지 않습니다. 메시징 제공자가 IBM MQ 메시지를 JMS 메시지로 변환할 때, MQMD 및 MQRFH2 헤더의 정보를 사용하여 JMS 헤더 필드와 특성을 설정합니다. 비슷하게, 메시징 제공자가 JMS 메시지를 IBM MQ 메시지로 변환할 때, JMS 헤더 필드와 특성을 사용하여 MQMD 및 MQRFH2 헤더를 구성합니다.

JMS 제공자는 IBM MQ 메시지를 JMS BytesMessage로(부터) 변환하여 IBM MQ 메시지의 다른 헤더를 처리합니다. 헤더는 메시지 본문의 시작에 나타나고 IBM MQ 메시지 페이로드(있는 경우)가 뒤따릅니다. JMS 메시지의 JMS_IBM_Format 특성은 메시지 본문의 데이터 형식(이 경우에는 첫 번째 헤더)을 표시하며 JMS_IBM_EncodingJMS_IBM_Character_Set 특성은 그의 인코딩 및 CCSID를 표시합니다.

JMS BytesMessage에서 IBM MQ 메시지 헤더 처리

com.ibm.mq.headers 패키지에는 JMS BytesMessage의 본문에 있는 IBM MQ 헤더를 구문 분석 및 조작하는 데 사용할 수 있는 클래스 및 인터페이스가 들어 있습니다. MQHeader 인터페이스는 헤더 필드 액세스 및 메시지 컨텐츠 읽기 및 쓰기를 위한 범용 메소드를 제공합니다. 각 헤더 유형은 MQHeader 인터페이스를 구현하는 자체 클래스를 갖고 있으며 개별 필드를 위한 getter 및 setter 메소드를 추가합니다. 예를 들어, MQCIH 클래스는 MQCIH(CICS® Bridge) 헤더 유형을 나타냅니다. 헤더 클래스는 모든 필요한 데이터 변환을 자동으로 수행하며, 임의의 지정된 숫자 인코딩 또는 문자 세트(CCSID)의 데이터를 읽거나 쓸 수 있습니다.

두 헬퍼 클래스인 MQHeaderIterator 및 MQHeaderList는 메시지의 헤더 컨텐츠 읽기 및 디코딩(구문 분석)을 도와줍니다.
  • MQHeaderIterator는 java.util.Iterator처럼 작업합니다. 메시지에 추가 헤더가 있는 한, next() 메소드는 true를 리턴하고, nextHeader() 또는 next() 메소드는 다음 헤더 오브젝트를 리턴합니다.
  • MQHeaderList는 java.util.List처럼 작업합니다. MQHeaderIterator처럼 헤더 컨텐츠를 구문 분석하지만, 또한 특정 헤더를 검색하고 새 헤더를 추가하고 기존 헤더를 제거하고 헤더 필드를 업데이트한 후 헤더 컨텐츠를 다시 메시지에 기록할 수 있게 합니다. 다른 방법으로는, 빈 MQHeaderList를 작성한 후 헤더 인스턴스로 채우고 이를 메시지에 한 번 또는 반복적으로 쓸 수 있습니다.

모든 헤더 클래스는 MQHeader 인터페이스를 구현하는데, int read (java.io.DataInput message, int encoding, int characterSet)int write (java.io.DataOutput message, int encoding, int characterSet) 메소드를 제공합니다. java.io.DataInputStream 및 java.io.DataOutputStream 클래스는 각각 DataInput 및 DataOutput을 구현합니다. 단일 MQCIH 헤더를 처리하는 다음 예제에서와 같이, JMS 메시지에서 운반되는 바이트 배열로부터 DataInput 및 DataOutput 오브젝트를 확보할 수 있습니다.

import java.io.*;
import javax.jms.*;
import com.ibm.mq.headers.*;
...
BytesMessage bytesMessage = (BytesMessage) msg; // Message received from JMS consumer
byte[] bytes = new byte [(int) bytesMessage.getBodyLength ()];
bytesMessage.readBytes (bytes);
DataInput in = new DataInputStream (new ByteArrayInputStream (bytes));
MQCIH cih = new MQCIH (in, 
   bytesMessage.getIntProperty("JMS_IBM_Encoding"), 
   819); 

다른 방법으로는, MQHeaderIterator 클래스를 사용하여 헤더의 시퀀스를 처리할 수 있으며, MQCIH cih = new MQCIH로 시작하는 행을 다음으로 바꿀 수 있습니다.

MQHeaderIterator it = new MQHeaderIterator (in, 
   bytesMessage.getStringProperty("JMS_IBM_Format"), 
   bytesMessage.getIntProperty("JMS_IBM_Encoding"), 
   819);
while (it.hasNext()) {
   MQHeader item = (MQHeader) it.next();
   ...
}

이 예는 단일 헤더(MQCIH 유형 헤더)를 작성하며 이를 BytesMessage에 추가합니다.

import java.io.*;
import javax.jms.*;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.headers.*;
...
MQCIH header = new MQCIH();
ByteArrayOutputStream out = new ByteArrayOutputStream ();

header.write (new DataOutputStream (out), CMQC.MQENC_NATIVE, 819);
byte[] bytes = out.toByteArray ();
BytesMessage newMsg = origSes.createBytesMessage();
newMsg.writeBytes(bytes);

이 예는 MQHeaderList 클래스를 사용하여 두 헤더를 BytesMessage에 추가합니다.

import java.io.*;
import javax.jms.*;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.headers.*;
...
byte[] outheaders = null;
byte[] outbody = ...
try {
    MQHeaderList it = new MQHeaderList ();
    MQHeader header1 = ... // Could be any header type
    MQHeader header2 = ... // Could be any header type
    ByteArrayOutputStream out = new ByteArrayOutputStream ();
    DataOutput dout = new DataOutputStream(out);
    it.add(header1);
    it.add(header2); 
    it.write(dout);
    outheaders = out.toByteArray();
} catch (Exception e) {
    System.out.println("error generating MQ message headers : " + e);
}
BytesMessage newMsg = origSes.createBytesMessage();
newMsg.writeBytes(outheaders);
newMsg.writeBytes(bytes);

newMsg.setStringProperty("JMS_IBM_Format", "MQCICS"); 
newMsg.setIntProperty("JMS_IBM_Encoding", CMQC.MQENC_NATIVE); 
newMsg.setIntProperty("JMS_IBM_Character_Set", 819);

항상 인코딩 및 characterSet 인수에 대해 올바른 값을 사용하십시오. 헤더를 읽을 때, 바이트 컨텐츠가 원래 기록되었던 인코딩 및 CCSID를 지정하십시오. 헤더를 쓸 때 생성하려는 인코딩 및 CCSID를 지정하십시오. 헤더 클래스에 의해 데이터 변환이 자동으로 수행됩니다.

com.ibm.mq.headers 클래스에 대한 자세한 정보

com.ibm.mq.headers 패키지는 WebSphere Application Server에 자동으로 설치되는 IBM MQ 자원 어댑터의 일부입니다. 이 패키지는 Java™ 프로그래머가 IBM MQ 메시지 헤더에 대해 작업하도록 허용하는 클래스 및 인터페이스의 세트로 구성됩니다. 여기에는 이 주제에서 언급되는 MQHeaderIterator 및 MQHeaderList 클래스와, 다음을 포함하여 몇 가지 공통적으로 사용되는 IBM MQ 메시지 헤더를 위한 클래스가 포함됩니다.
  • MQCIH – CICS 브릿지 헤더
  • MQIIH – IMS™ 정보 헤더
  • MQSAPH – SAP 헤더

또한 사용자 자신의 헤더를 나타내는 클래스를 정의할 수도 있습니다.


주제 유형을 표시하는 아이콘 참조 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rjc_mqheader_proc
파일 이름:rjc_mqheader_proc.html