IBM MQ classes for JMS を使用したアプリケーションからの IBM MQ メッセージ・データへのアクセス
MQRFH2ヘッダー、その他の'IBM MQヘッダー、 および以下のメッセージデータが含まれる。 宛先の WMQ_MESSAGE_BODY プロパティーを WMQ_MESSAGE_BODY_MQ に設定して、JMSBytesMessage 内のすべてのメッセージ本体データを受信します。
WMQ_MESSAGE_BODY が WMQ_MESSAGE_BODY_JMS または WMQ_MESSAGE_BODY_UNSPECIFIEDに設定されている場合、メッセージ本体は JMS MQRFH2 ヘッダーなしで戻され、 JMSBytesMessage のプロパティーは RFH2に設定されたプロパティーを反映します。
一部のアプリケーションは、このトピックで説明している機能を使用できません。 アプリケーションが IBM MQ V6 キュー・マネージャーに接続されている場合、または PROVIDERVERSION が 6に設定されている場合、この機能は使用できません。
メッセージの送信
メッセージの送信の際、宛先プロパティー WMQ_MESSAGE_BODY は WMQ_TARGET_CLIENT よりも優先されます。WMQ_MESSAGE_BODY が WMQ_MESSAGE_BODY_JMSに設定されている場合、 IBM MQ classes for JMS は、 JMSMessage プロパティーおよびヘッダー・フィールドの設定に基づいて MQRFH2 ヘッダーを自動的に生成します。
WMQ_MESSAGE_BODY が WMQ_MESSAGE_BODY_MQ に設定されている場合、メッセージ本体に追加のヘッダーが加えられることはありません。
WMQ_MESSAGE_BODY_UNSPECIFIEDに設定されている場合、 WMQ_TARGET_CLIENT が WMQ_TARGET_DEST_MQに設定されていない限り、 IBM MQ classes for JMS は MQRFH2 ヘッダーを送信します。 受信の際、WMQ_TARGET_CLIENT が WMQ_TARGET_DEST_MQ に設定されていると、あらゆる MQRFH2 がメッセージ本体から削除されます。MQRFH2は必要ありませんが、 JMSStreamMessage、 JMSMapMessage、および JMSObjectMessage には必要です。WMQ_MESSAGE_BODY_UNSPECIFIED は WMQ_MESSAGE_BODY のデフォルト設定であり、WMQ_TARGET_DEST_JMS は WMQ_TARGET_CLIENT のデフォルト設定です。
- 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 ヘッダーまたはアプリケーション・ペイロードのエンコードを指定します。
trueに設定されている限り、 JMS_IBM_MQMD_* プロパティーは対応する JMS_IBM_* プロパティーをオーバーライドします。JMS_IBM_MQMD_* と JMS_IBM_* を使用したメッセージ・プロパティーの設定には、実際には大きな相違があります。JMS_IBM_MQMD_*プロパティーは、 IBM MQ JMS プロバイダーに固有のものです。JMS_IBM_MQMD_*プロパティーは、MQMDでのみ設定されます。JMS_IBM_*プロパティーがMQMDに設定されるのは、メッセージにMQRFH2JMS ヘッダーがない場合のみです。 それ以外の場合は、 JMSRFH2ヘッダーに設定されます。JMS_IBM_MQMD_*プロパティーは JMSMessage に書き込まれたテキストおよび数値のエンコード方式には影響しません。受信側のアプリケーションは、
MQMD.EncodingとMQMD.CodedCharSetIdの値が、メッセージ本体内の数値およびテキストのエンコード方式と文字セットに対応していると見なす場合があります。JMS_IBM_MQMD_*プロパティーを使用する場合、送信側アプリケーションでそのように設定する必要があります。 メッセージ本体内の数値およびテキストのエンコード方式と文字セットは、JMS_IBM_*プロパティーで設定します。図 1 の正しくコーディングされていないスニペットは、MQMD.CodedCharSetIdが 37 に設定された文字セット 1208 でエンコードされたメッセージを送信します。図1: 一貫性なくコード化された MQMDとメッセージ・データ- 誤ってエンコードされたメッセージの送信
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); MQMD.CodedCharSetIdの値によって設定される JMS_IBM_CHARACTER_SET の値に依存するメッセージの受信:TextMessage tmi = (TextMessage) cons.receive(); System.out.println("Message is \"" + tmi.getText() + "\"");- 結果としての出力:
Message is "éÈÊ'>...??>?"
- 誤ってエンコードされたメッセージの送信
MQRFH2 ヘッダーが追加されずにアプリケーション・ペイロードが含まれます。WMQ_MESSAGE_BODY_MQの設定:((MQDestination) destination).setMessageBodyStyle (WMQConstants.WMQ_MESSAGE_BODY_MQ);WMQ_TARGET_DEST_MQの設定:((MQDestination) destination).setMessageBodyStyle (WMQConstants.WMQ_MESSAGE_BODY_UNSPECIFIED); ((MQDestination) destination). setTargetClient(WMQConstants.WMQ_TARGET_DEST_MQ);
メッセージの受信
WMQ_MESSAGE_BODY が WMQ_MESSAGE_BODY_JMSに設定されている場合、インバウンド JMS メッセージ・タイプおよび本体は、受信した WebSphere MQ メッセージの内容によって決定されます。 このメッセージ・タイプおよび本体は、MQRFH2 ヘッダー内のフィールドによって決定されます。または、MQRFH2 がない場合は MQMD 内のフィールドによって決定されます。
WMQ_MESSAGE_BODY が WMQ_MESSAGE_BODY_MQに設定されている場合、インバウンド JMS メッセージ・タイプは JMSBytesMessageです。 JMS メッセージ本体は、基礎となる MQGET API 呼び出しによって戻されるメッセージ・データです。 メッセージ本体の長さは、MQGET 呼び出しによって戻された長さです。 メッセージ・ボディのデータの文字セットとエンコーディングは、MQMDの CodedCharSetIdフィールドとEncodingフィールドによって決定される。 メッセージ本体のデータのフォーマットは、 MQMD の 「フォーマット」 フィールドによって決定されます。
WMQ_MESSAGE_BODY が WMQ_MESSAGE_BODY_UNSPECIFIEDに設定されている場合 (デフォルト値)、 IBM MQ classes for JMS によって WMQ_MESSAGE_BODY_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 ヘッダーまたはアプリケーション・ペイロードのエンコードを指定します。
MQMD のフォーマット・フィールドの内容に関係なく、メッセージは JMSBytesMessage となります。 ((MQDestination)destination).setMessageBodyStyle
(WMQConstants.WMQ_MESSAGE_BODY_MQ);