IBM MQ classes for JMS を使用したアプリケーションからの IBM MQ メッセージ・データへのアクセス

IBM MQ classes for JMSを使用して、アプリケーション内の完全な IBM® MQ メッセージ・データにアクセスできます。 すべてのデータにアクセスするには、メッセージが JMSBytesMessage である必要があります。 JMSBytesMessageのボディには、任意の'MQRFH2ヘッダー、その他の'IBM MQヘッダー、 および以下のメッセージデータが含まれる。

宛先の WMQ_MESSAGE_BODY プロパティーを WMQ_MESSAGE_BODY_MQ に設定して、JMSBytesMessage 内のすべてのメッセージ本体データを受信します。

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_JMS または WMQ_MESSAGE_BODY_UNSPECIFIEDに設定されている場合、メッセージ本体は JMS MQRFH2 ヘッダーなしで戻され、 JMSBytesMessage のプロパティーは RFH2に設定されたプロパティーを反映します。

一部のアプリケーションは、このトピックで説明している機能を使用できません。 アプリケーションが IBM MQ V6 キュー・マネージャーに接続されている場合、または PROVIDERVERSION6に設定されている場合、この機能は使用できません。

メッセージの送信

メッセージの送信の際、宛先プロパティー WMQ_MESSAGE_BODYWMQ_TARGET_CLIENT よりも優先されます。

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_JMSに設定されている場合、 IBM MQ classes for JMS は、 JMSMessage プロパティーおよびヘッダー・フィールドの設定に基づいて MQRFH2 ヘッダーを自動的に生成します。

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_MQ に設定されている場合、メッセージ本体に追加のヘッダーが加えられることはありません。

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_UNSPECIFIEDに設定されている場合、 WMQ_TARGET_CLIENTWMQ_TARGET_DEST_MQに設定されていない限り、 IBM MQ classes for JMSMQRFH2 ヘッダーを送信します。 受信の際、WMQ_TARGET_CLIENTWMQ_TARGET_DEST_MQ に設定されていると、あらゆる MQRFH2 がメッセージ本体から削除されます。
注: JMSBytesMessage および JMSTextMessage には MQRFH2は必要ありませんが、 JMSStreamMessageJMSMapMessage、および JMSObjectMessage には必要です。

WMQ_MESSAGE_BODY_UNSPECIFIEDWMQ_MESSAGE_BODY のデフォルト設定であり、WMQ_TARGET_DEST_JMSWMQ_TARGET_CLIENT のデフォルト設定です。

JMSBytesMessageを送信する場合、 IBM MQ メッセージの構成時に JMS メッセージ本体のデフォルト設定をオーバーライドできます。 以下のプロパティーを使用します。
  • JMS_IBM_Format または JMS_IBM_MQMD_Format: このプロパティーは、先行する WebSphere MQ ヘッダーがない場合に JMS メッセージ本体を開始する IBM MQ ヘッダーまたはアプリケーション・ペイロードの形式を指定します。
  • JMS_IBM_Character_Set または JMS_IBM_MQMD_CodedCharSetId :このプロパティは、先行する WebSphere MQ ヘッダがない場合に JMS メッセージ本体を開始する IBM MQ ヘッダまたはアプリケーションペイロードの CCSID を指定します。
  • JMS_IBM_Encoding または JMS_IBM_MQMD_Encoding: このプロパティーは、先行する WebSphere MQ ヘッダーがない場合に JMS メッセージ本体を開始する IBM MQ ヘッダーまたはアプリケーション・ペイロードのエンコードを指定します。
両方のタイプのプロパティーが指定されている場合、宛先プロパティー WMQ_MQMD_WRITE_ENABLEDtrueに設定されている限り、 JMS_IBM_MQMD_* プロパティーは対応する JMS_IBM_* プロパティーをオーバーライドします。
JMS_IBM_MQMD_*JMS_IBM_* を使用したメッセージ・プロパティーの設定には、実際には大きな相違があります。
  1. JMS_IBM_MQMD_* プロパティーは、 IBM MQ JMS プロバイダーに固有のものです。
  2. JMS_IBM_MQMD_* プロパティーは、MQMD でのみ設定されます。 JMS_IBM_* プロパティーが MQMD に設定されるのは、メッセージに MQRFH2 JMS ヘッダーがない場合のみです。 それ以外の場合は、 JMS RFH2 ヘッダーに設定されます。
  3. JMS_IBM_MQMD_* プロパティーは JMSMessage に書き込まれたテキストおよび数値のエンコード方式には影響しません。

    受信側のアプリケーションは、MQMD.EncodingMQMD.CodedCharSetId の値が、メッセージ本体内の数値およびテキストのエンコード方式と文字セットに対応していると見なす場合があります。 JMS_IBM_MQMD_* プロパティーを使用する場合、送信側アプリケーションでそのように設定する必要があります。 メッセージ本体内の数値およびテキストのエンコード方式と文字セットは、JMS_IBM_* プロパティーで設定します。

    図 1 の正しくコーディングされていないスニペットは、 MQMD.CodedCharSetId が 37 に設定された文字セット 1208 でエンコードされたメッセージを送信します。
    図1: 一貫性なくコード化された MQMD とメッセージ・データ
    1. 誤ってエンコードされたメッセージの送信
      TextMessage tmo = session.createTextMessage();
      ((MQDestination) destination).setMessageBodyStyle
                      (WMQConstants.WMQ_MESSAGE_BODY_MQ);
      ((MQDestination)destination).setMQMDWriteEnabled(true);
      tmo.setIntProperty(WMQConstants.JMS_IBM_MQMD_CODEDCHARSETID, 37);
      tmo.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET, 1208);
      tmo.setText("String one");
      producer.send(tmo);
      
    2. MQMD.CodedCharSetIdの値によって設定される JMS_IBM_CHARACTER_SET の値に依存するメッセージの受信:
      TextMessage tmi = (TextMessage) cons.receive();
      System.out.println("Message is \"" + tmi.getText() + "\"");
      
    3. 結果としての出力:
      Message is "éÈÊ'>...??>?"
      
図 2 のコードのスニペットのいずれかにより、メッセージがキューまたはトピックに書き込まれます。その本文には、自動的に生成された MQRFH2 ヘッダーが追加されずにアプリケーション・ペイロードが含まれます。
図2: MQ メッセージ本体が含まれたメッセージの送信
  1. WMQ_MESSAGE_BODY_MQ の設定:
    ((MQDestination) destination).setMessageBodyStyle
                    (WMQConstants.WMQ_MESSAGE_BODY_MQ);
    
  2. WMQ_TARGET_DEST_MQ の設定:
    ((MQDestination) destination).setMessageBodyStyle
                    (WMQConstants.WMQ_MESSAGE_BODY_UNSPECIFIED);
    ((MQDestination) destination).
                    setTargetClient(WMQConstants.WMQ_TARGET_DEST_MQ);
    

メッセージの受信

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_JMSに設定されている場合、インバウンド JMS メッセージ・タイプおよび本体は、受信した WebSphere MQ メッセージの内容によって決定されます。 このメッセージ・タイプおよび本体は、MQRFH2 ヘッダー内のフィールドによって決定されます。または、MQRFH2 がない場合は MQMD 内のフィールドによって決定されます。

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_MQに設定されている場合、インバウンド JMS メッセージ・タイプは JMSBytesMessageです。 JMS メッセージ本体は、基礎となる MQGET API 呼び出しによって戻されるメッセージ・データです。 メッセージ本体の長さは、MQGET 呼び出しによって戻された長さです。 メッセージ・ボディのデータの文字セットとエンコーディングは、MQMDCodedCharSetIdフィールドとEncodingフィールドによって決定される。 メッセージ本体のデータのフォーマットは、 MQMD「フォーマット」 フィールドによって決定されます。

WMQ_MESSAGE_BODYWMQ_MESSAGE_BODY_UNSPECIFIEDに設定されている場合 (デフォルト値)、 IBM MQ classes for JMS によって WMQ_MESSAGE_BODY_JMSに設定されます。

JMSBytesMessage を受信したならば、以下のプロパティーを参照してデコードすることができます。
  • JMS_IBM_Format または JMS_IBM_MQMD_Format: このプロパティーは、先行する WebSphere MQ ヘッダーがない場合に JMS メッセージ本体を開始する IBM MQ ヘッダーまたはアプリケーション・ペイロードの形式を指定します。
  • JMS_IBM_Character_Set または JMS_IBM_MQMD_CodedCharSetId :このプロパティは、先行する WebSphere MQ ヘッダがない場合に JMS メッセージ本体を開始する IBM MQ ヘッダまたはアプリケーションペイロードの CCSID を指定します。
  • JMS_IBM_Encoding または JMS_IBM_MQMD_Encoding: このプロパティーは、先行する WebSphere MQ ヘッダーがない場合に JMS メッセージ本体を開始する IBM MQ ヘッダーまたはアプリケーション・ペイロードのエンコードを指定します。
以下のコード・スニペットの結果は、受信されたメッセージ (JMSBytesMessage) となります。 受信されたメッセージ、および受信された MQMD のフォーマット・フィールドの内容に関係なく、メッセージは JMSBytesMessage となります。
  ((MQDestination)destination).setMessageBodyStyle
                              (WMQConstants.WMQ_MESSAGE_BODY_MQ);