この章では、Oracle Messaging Gateway (MGW)がメッセージ・フォーマットを1つのメッセージ・システムから別のメッセージ・システムに変換する方法について説明します。通常、変換が必要になるのはメッセージをOracle Streams Advanced Queuingと別のシステムの間で移動する場合で、これは異なるメッセージ・システムでは異なるメッセージ・フォーマットが使用されているためです。Java Message Service (JMS)メッセージは特殊です。JMSメッセージはJMS宛先にのみ伝播可能なので、変換は単純な処理になります。
内容は次のとおりです。
MGWでは、伝播中に、ソース側メッセージ・システム固有のメッセージ・フォーマットが宛先側メッセージ・システム固有のメッセージ・フォーマットに変換されます。MGWでは、標準型およびOracle Streams Advanced Queuingベースのモデルを使用して変換が行われます。
MGWによってメッセージが伝播される場合、メッセージはソース・キュー・システム固有のフォーマットから宛先キュー・システム固有のフォーマットに変換されます。
ネイティブなメッセージには、通常、メッセージ・ヘッダーとメッセージ本体が含まれます。ヘッダーには、メッセージ・システム内のすべてのメッセージに存在する固定ヘッダー・フィールドが含まれます。たとえば、Oracle Streams Advanced Queuingのメッセージ・プロパティやWebSphere MQの固定ヘッダーなどです。本体には、Oracle Streams Advanced Queuingのペイロード、WebSphere MQのメッセージ本体、またはTIB/Rendezvousのメッセージ全体などのメッセージ・コンテンツが含まれます。MGWでは、メッセージ・ヘッダーおよびメッセージ本体コンポーネントの両方が変換されます。
図20-1は、2つのステージでJMS以外のメッセージを変換する方法を示したものです。メッセージは、最初にソース・キューのシステム固有のフォーマットからMGWの内部メッセージ・フォーマットに変換され、次に、内部メッセージ・フォーマットから宛先キューのシステム固有のフォーマットに変換されます。
MGWエージェントでは、Oracle Streams Advanced Queuingのメッセージ・プロパティに類似したヘッダーと、MGWの標準型で表される本体で構成された、内部メッセージ・フォーマットが使用されます。
MGWでは標準型が定義され、Oracle Streams Advanced QueuingとOracle以外のメッセージ・システム間でのメッセージ変換がサポートされます。標準型は、メッセージ型をOracle DatabaseでのPL/SQL Oracleタイプの形式で表したものです。標準型は、RAW、SYS.MGW_BASIC_MSG_TおよびSYS.MGW_TIBRV_MSG_Tです。
WebSphere MQ伝播では、標準型SYS.MGW_BASIC_MSG_TおよびRAWがサポートされます。TIB/Rendezvous伝播では、標準型SYS.MGW_TIBRV_MSG_TおよびRAWがサポートされます。
|
関連項目: SYS.MGW_BASIC_MSG_TおよびSYS.MGW_TIBRV_MSG_Tの構文および属性情報は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_MGWMSGに関する項を参照してください。 |
MGWでは、Oracle Streams Advanced Queuingメッセージ・プロパティと、同じセマンティクスのOracle Streams Advanced Queuingメッセージ・プロパティに対応する値を含むOracle以外のメッセージ・ヘッダー・フィールドとの間で、デフォルトのマッピングが行われます。MGWによってマッピングが行われない場合、メッセージ・ヘッダー・フィールドはデフォルト値(通常、メッセージ・システムによって定義されたデフォルト値)に設定されます。
Oracle Streams Advanced Queuingメッセージ間で変換する場合、MGWエージェントでは通常、標準型のみが使用されます。ただし、任意のペイロード型は、Oracle Streams Advanced Queuingのキュー・ペイロードとMGW標準型間で変換するために、ユーザー定義のOracle Streams Advanced Queuingのメッセージ変換機能によってサポートされます。
任意のADTペイロード(発信伝播)によってOracle Streams Advanced Queuingのキューからメッセージを伝播するMGWには、MGWの標準ユーザー定義型に対するマッピングが必要です。変換は、MGWエージェントによってOracle Streams Advanced Queuingのキューからメッセージがデキューされると起動されます。同様に、任意のユーザー定義型ペイロード(着信伝播)によってOracle Streams Advanced Queuingのキューにメッセージを伝播するMGWには、MGWの標準ユーザー定義型からのマッピングが必要です。変換は、MGWエージェントによってOracle Streams Advanced Queuingのキューにメッセージがエンキューされると起動されます。
変換は常にMGWエージェントとの関連で実行されますが、これはMGWエージェント・ユーザー(DBMS_MGWADM.CREATE_AGENTまたはDBMS_MGWADM.ALTER_AGENTを使用して指定したユーザー)には、変換ファンクションおよびOracle Streams Advanced Queuingペイロード型に対するEXECUTE権限が必要であることを意味しています。これは、PUBLICにEXECUTE権限を付与するか、またはMGWエージェントのユーザーに直接EXECUTE権限を付与することによって実現できます。
変換によってMGW伝播ジョブを構成する手順は、次のとおりです。
変換ファンクションを作成します。
MGWエージェントのユーザーまたはPUBLICに、ファンクションおよびそのファンクションが参照するオブジェクト型に対するEXECUTE権限を付与します。
DBMS_TRANSFORM.CREATE_TRANSFORMATIONをコールして、変換を登録します。
変換によってMGW伝播ジョブを作成する場合はDBMS_MGWADM.CREATE_JOBを、既存のジョブを変更する場合はDBMS_MGWADM.ALTER_JOBをコールします。
これらのAPIの変換パラメータに渡される値は、ファンクション名ではなく登録された変換名である必要があります。たとえば、trans_sampleadt_to_mgw_basicは、例20-1で示した署名によって変換ファンクションを表すストアド・プロシージャです。
|
注意: この例のすべてのコマンドは、変換を作成するコマンドを除き、MGW_ADMINISTRATOR_ROLEが付与されたユーザーとして実行する必要があります。 |
例20-1 変換ファンクションの署名
FUNCTION trans_sampleadt_to_mgw_basic(in_msg IN mgwuser.sampleADT) RETURN SYS.MGW_BASIC_MSG_T;
例20-2に示すように、DBMS_TRANSFORM.CREATE_TRANSFORMATIONを使用して変換を作成できます。
例20-2 変換の作成
BEGIN
DBMS_TRANSFORM.CREATE_TRANSFORMATION(
schema => 'mgwuser',
name => 'sample_adt_to_mgw_basic',
from_schema => 'mgwuser',
from_type => 'sampleadt',
to_schema => 'sys',
to_type => 'MGW_BASIC_MSG_T',
transformation => 'mgwuser.trans_sampleadt_to_mgw_basic(user_data)');
END;
いったん作成した後は、伝播ジョブの作成時にこの変換をMGWに登録できます。例20-3ではジョブjob_aq2mqを作成します。これのメッセージはOracle Streams Advanced Queuingのキューmgwuser.srcqからOracle以外のメッセージ・システム・キューdestq@mqlinkに変換mgwuser.sample_adt_to_mgw_basicを使用して伝播されます。
例20-3 変換の登録
BEGIN
DBMS_MGWADM.CREATE_JOB(
job_name => 'job_aq2mq',
propagation_type => DBMS_MGWADM.OUTBOUND_PROPAGATION,
source => 'mgwuser.srcq',
destination => 'destq.mqlink',
transformation => 'mgwuser.sample_adt_to_mgw_basic',
exception_queue => 'mgwuser.excq');
END;
|
関連項目: 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_MGWADM、DBMS_MGWMSGおよびDBMS_TRANSFORMに関する項 |
通常、ユーザー定義の変換を実行中に発生するエラーはメッセージ変換例外とみなされ、メッセージは例外キューに移動されます(存在する場合)。
MGWでは、論理変更レコード(LCR)を伝播する機能を提供しています。変換の作成を支援し、ペイロード型ANYDATAでキューに格納されているLCR行およびDDL LCRの両方の伝播を処理するルーチンが提供されています。LCRは、適切なメッセージ型で格納されているXML文字列として伝播されます。
|
注意: LCR伝播については、XDBパッケージをロードする必要があります。 |
Oracle Streamsでは、ANYDATAキューを使用してLCRを格納するため、ANYDATAキューが発信伝播のソースとなります。変換では最初にMGWルーチンDBMS_MGWMSG.LCR_TO_XMLを使用して、LCRを含むANYDATAオブジェクトをXML型オブジェクトに変換する必要があります。ANYDATAオブジェクトにLCRが含まれない場合は、このルーチンでエラーが発生します。次に、LCRのXML文書の文字列がXML型から抽出され、適切なMGW標準型(SYS.MGW_BASIC_MSG_TまたはSYS.MGW_TIBRV_MSG_T)に配置されます。
例20-4は、LCR発信伝播用に使用される変換を簡素化して示したものです。変換によって、LCRを含むANYDATAペイロードがSYS.MGW_TIBRV_MSG_Tオブジェクトに変換されます。LCRをXML文書として表す文字列が、ORACLE_LCRというフィールドに配置されます。
例20-4 発信LCRの変換
create or replace function any2tibrv(adata in anydata)
return SYS.MGW_TIBRV_MSG_T is
v_xml XMLType;
v_text varchar2(2000);
v_tibrv sys.mgw_tibrv_msg_t;
BEGIN
v_xml := dbms_mgwmsg.lcr_to_xml(adata);
-- assume the lcr is smaller than 2000 characters long.
v_text := v_xml.getStringVal();
v_tibrv := SYS.MGW_TIBRV_MSG_T.CONSTRUCT;
v_tibrv.add_string('ORACLE_LCR', 0, v_text);
return v_tibrv;
END any2tibrv;
LCR着信伝播の場合、MGW標準型(SYS.MGW_BASIC_MSG_TまたはSYS.MGW_TIBRV_MSG_T)が変換ソースの型となります。LCRをXML文書のフォーマットで表す文字列は、標準型に含まれる必要があります。変換ファンクションはメッセージから文字列を抽出し、そこからXML型オブジェクトを作成し、MGWルーチンDBMS_MGWMSG.XML_TO_LCRを使用してLCRを含むANYDATAオブジェクトに変換する必要があります。元のXML文書がLCRを表していない場合は、このルーチンでエラーが発生します。
例20-5は、LCR着信伝播用に使用される変換を簡素化して示したものです。変換によって、LCRを表すXML文字列を含むフィールドがあるSYS.MGW_TIBRV_MSG_Tオブジェクトが、ANYDATAオブジェクトに変換されます。LCRをXML文書として表す文字列が、ORACLE_LCRというフィールドから取得されます。
例20-5 着信LCRの変換
create or replace function tibrv2any(tdata in sys.mgw_tibrv_msg_t)
return anydata is
v_field sys.mgw_tibrv_field_t;
v_xml XMLType;
v_text varchar2(2000);
v_any anydata;
BEGIN
v_field := tdata.get_field_by_name('ORACLE_LCR');
-- type checking
v_text := v_field.text_value;
-- assume it is not null
v_xml := XMLType.createXML(v_text);
v_any := dbms_mgwmsg.xml_to_lcr(v_xml);
return v_any;
END tibrv2any;
|
関連項目:
|
MGWによって、MGW標準型とWebSphere MQ固有のメッセージ・フォーマット間の変換が行われます。WebSphere MQ固有のメッセージは、固定されたメッセージ・ヘッダーとメッセージ本体で構成されます。メッセージ本体は、TEXT値またはRAW(バイト)値のいずれかとして処理されます。WebSphere MQ伝播用にサポートされている標準型は、SYS.MGW_BASIC_MSG_TとRAWです。
図20-3 SYS.MGW_BASIC_MSG_T使用によるWebSphere MQのメッセージ変換

図20-3は、MGW WebSphere MQドライバで標準型SYS.MGW_BASIC_MSG_Tを使用して実行されるメッセージ変換を示したものです。発信伝播の場合、ドライバによって、Oracle Streams Advanced Queuingメッセージ・プロパティおよび標準型メッセージが、固定ヘッダーおよびメッセージ本体を含むWebSphere MQシステム固有のメッセージにマップされます。着信伝播の場合、ドライバによって、システム固有のメッセージが一連のOracle Streams Advanced Queuingメッセージ・プロパティおよび標準型メッセージにマップされます。標準型がRAWの場合、標準型ヘッダーが存在しないこと以外はマッピング方法は同じです。
MGW発信伝播ジョブで使用される標準型がRAWの場合、WebSphere MQヘッダー情報はRAWメッセージ本体からは設定されません。同様に着信伝播の場合、WebSphere MQヘッダー情報はRAWメッセージ本体には保持されません。ただし、MGW標準型SYS.MGW_BASIC_MSG_Tには、発信伝播のWebSphere MQヘッダー・フィールドを指定する際に使用でき、さらに着信伝播のWebSphere MQヘッダー・フィールドを保持できるヘッダーがあります。
この項では、SYS.MGW_BASIC_MSG_Tを標準型として使用してWebSphere MQメッセージ・システムに対してサポートされているメッセージ・プロパティについて説明します。表20-1に、WebSphere MQヘッダー・プロパティの記述に使用されるMGWの{名前, 値}の組の定義を示します。最初の列は、SYS.MGW_BASIC_MSG_TヘッダーのSYS.MGW_NAME_VALUE_T.NAMEフィールドの有効文字列値です。2番目の列は、名前に対応するSYS.MGW_NAME_VALUE_T.TYPE値です。(カッコ内の数字については、「表20-1に関する注意」を参照してください)。
|
関連項目: 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_MGWMSGに関する項 |
着信伝播の場合、WebSphere MQドライバによって、ソース・メッセージ・ヘッダーに基づいて{名前, 値}の組が生成され、SYS.MGW_BASIC_MSG_T型の標準型メッセージのヘッダー部分に格納されます。発信伝播の場合、WebSphere MQドライバによって、SYS.MGW_BASIC_MSG_T標準型メッセージのヘッダー部分に格納されたこれらのプロパティに対する{名前, 値}の組から、メッセージ・ヘッダーおよびエンキュー・オプションが設定されます。
表20-1 WebSphere MQのヘッダー値に対するMGWの名前
| MGWの名前 | MGWの型 | WebSphere MQプロパティ名 | 用途 |
|---|---|---|---|
MGW_MQ_accountingToken |
RAW_VALUE (size 32) |
accountingToken |
発信(1)、着信 |
MGW_MQ_applicationIdData |
TEXT_VALUE (size 32) |
applicationIdData |
発信(1)、着信 |
MGW_MQ_applicationOriginData |
TEXT_VALUE (size 4) |
applicationOriginData |
発信(1)、着信 |
MGW_MQ_backoutCount |
INTEGER_VALUE |
backoutCount |
着信 |
MGW_MQ_characterSet |
INTEGER_VALUE |
characterSet |
発信、着信 |
MGW_MQ_correlationId |
RAW_VALUE (size 24) |
correlationId |
発信(1)、着信 |
MGW_MQ_encoding |
INTEGER_VALUE |
encoding |
発信、着信 |
MGW_MQ_expiry |
INTEGER_VALUE |
expiry |
発信、着信 |
MGW_MQ_feedback |
INTEGER_VALUE |
feedback |
発信、着信 |
MGW_MQ_format |
TEXT_VALUE (size 8) |
format |
発信(1)、着信 |
MGW_MQ_groupId |
RAW_VALUE (size 24) |
groupId |
発信(1)、着信 |
MGW_MQ_messageFlags |
INTEGER_VALUE |
messageFlags |
発信、着信 |
MGW_MQ_messageId |
RAW_VALUE (size 24) |
messageId |
発信、着信 |
MGW_MQ_messageSequenceNumber |
INTEGER_VALUE |
messageSequenceNumber |
発信、着信 |
MGW_MQ_messageType |
INTEGER_VALUE |
messageType |
発信、着信 |
MGW_MQ_offset |
INTEGER_VALUE |
offset |
発信、着信 |
MGW_MQ_originalLength |
INTEGER_VALUE |
originalLength |
発信、着信 |
MGW_MQ_persistence |
INTEGER_VALUE |
persistence |
着信 |
MGW_MQ_priority |
INTEGER_VALUE |
priority |
発信、着信 |
MGW_MQ_putApplicationName |
TEXT_VALUE (size 28) |
putApplicationName |
発信(1)、着信 |
MGW_MQ_putApplicationType |
INTEGER_VALUE |
putApplicationType |
発信(1)、着信 |
MGW_MQ_putDateTime |
DATE_VALUE |
putDateTime |
着信 |
MGW_MQ_putMessageOptions |
INTEGER_VALUE |
putMessageOptions |
発信(1)(2) |
MGW_MQ_replyToQueueManagerName |
TEXT_VALUE (size 48) |
replyToQueueManagerName |
発信、着信 |
MGW_MQ_replyToQueueName |
TEXT_VALUE (size 48) |
replyToQueueName |
発信、着信 |
MGW_MQ_report |
INTEGER_VALUE |
report |
発信(1)、着信 |
MGW_MQ_userId |
TEXT_VALUE (size 12) |
userId |
発信、着信 |
表20-1に関する注意
この表での使用方法には、WebSphere MQの制約が適用されます。たとえば、送信メッセージに対してMGW_MQ_accountingTokenが設定されている場合、WebSphere MQの値は、MGW_MQ_putMessageOptionsがWebSphere MQ定数のMQPMD_SET_ALL_CONTEXTに設定されていないかぎり、オーバーライドされます。
MGW_MQ_putMessageOptionsは、WebSphere MQ Base Java Queue.put()メソッドのputMessageOptions引数として使用されています。WebSphere MQのヘッダー情報の一部ではないため、実際のメッセージのプロパティではありません。
WebSphere MQ Base JavaのMQQueueManager.accessQueueメソッドに対するopenOptions引数の値は、DBMS_MGWADM.REGISTER_FOREIGN_QUEUEをコールしてWebSphere MQキューが登録されるときに指定されます。これらの値の間には依存関係が存在する場合があります。たとえば、MGW_MQ_putMessageOptionsにMQPMD_SET_ALL_CONTEXTを含めるには、MQ_openMessageOptionキュー・オプションにMQOO_SET_CONTEXTを含める必要があります。
MGWエージェントによって、指定可能なすべての値にMQPMO_SYNCPOINTという値が追加されます。
MGWによって、次の2つのWebSphere MQのメッセージ・ヘッダー・フィールドのデフォルト値が設定されます。messageTypeのデフォルト値はMQMT_DATAGRAMに、putMessageOptionsのデフォルト値はMQPMO_SYNCPOINTに設定されます。
MGWには、Oracle Streams Advanced Queuingのメッセージ・プロパティとWebSphere MQのヘッダー・フィールド間の2つのデフォルト・マッピングがあります。
1つは、キュー内でメッセージが使用可能になったときのメッセージのTime-to-Liveを表すOracle Streams Advanced Queuingのメッセージ・プロパティのexpirationを、メッセージのTime-to-Liveを表すWebSphere MQのヘッダー・フィールドのexpiryにマップします。発信伝播の場合、expiryに使用する値はキュー内でメッセージが使用可能になった時刻をexpirationから引き算し、10分の1秒単位の値に変換します。Oracle Streams Advanced Queuing値のNEVERは、MQEI_UNLIMITEDにマップされます。着信伝播の場合、expirationは単に秒単位に変換されたexpiryです。WebSphere MQ値のMQEI_UNLIMITEDは、NEVERにマップされます。
その他のデフォルトは、Oracle Streams Advanced Queuingのメッセージ・プロパティのpriorityをWebSphere MQのヘッダー・フィールドのpriorityとともにマップします。表20-2で説明します。
表20-2 伝播のデフォルト優先順位のマッピング
| 伝播型 | メッセージ・システム | 優先順位の値 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
発信 |
Oracle Streamsのアドバンスト・キューイング |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
発信 |
WebSphere MQ |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
着信 |
Oracle Streamsのアドバンスト・キューイング |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
着信 |
WebSphere MQ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
注意: 発信伝播の場合、0未満のOracle Streams Advanced Queuing優先順位は、WebSphere MQ優先順位9にマップされ、9より大きいOracle Streams Advanced Queuing優先順位はWebSphere MQ優先順位0にマップされます。 |
発信伝播用のメッセージ変換が指定されていない場合は、Oracle Streams Advanced Queuingのソース・キューのペイロード型は、SYS.MGW_BASIC_MSG_TまたはRAWである必要があります。メッセージ変換が指定されている場合、変換のターゲットのユーザー定義型はSYS.MGW_BASIC_MSG_Tである必要がありますが、ソースのユーザー定義型はOracle Streams Advanced Queuingによってサポートされている任意のユーザー定義型が有効です。
Oracle Streams Advanced QueuingキューのペイロードがRAWの場合、WebSphere MQから取得されるメッセージには、RAWバイトの値に設定されたメッセージ本体と、デフォルトでは「MGW_Byte」値に設定されたformatフィールドがあります。
Oracle Streams Advanced Queuingキューのペイロードまたは変換ターゲットのユーザー定義型がSYS.MGW_BASIC_MSG_Tの場合、メッセージは次のようにWebSphere MQの固有メッセージにマップされます。
WebSphere MQの固定ヘッダー・フィールドは、「WebSphere MQメッセージ・ヘッダーのマッピング」で説明されているように、標準型メッセージの内部Oracle Streams Advanced Queuingメッセージ・プロパティおよびSYS.MGW_BASIC_MSG_T.header属性に基づいています。
標準型メッセージにTEXT本体がある場合は、WebSphere MQのフォーマット・ヘッダー・フィールドは、ヘッダー・プロパティMGW_MQ_formatによってオーバーライドされないかぎりMQFMT_STRINGに設定されます。メッセージ本体はテキストとみなされます。
標準型メッセージにRAW本体がある場合は、WebSphere MQのフォーマット・ヘッダー・フィールドは、ヘッダー・プロパティMGW_MQ_formatによってオーバーライドされないかぎりMQFMT_Byteに設定されます。メッセージ本体はRAWバイトとみなされます。
標準型メッセージに、TEXTおよびRAWの両方の本体が含まれる場合、メッセージ変換は失敗します。
標準型メッセージに、TEXT本体またはRAW本体のいずれも含まれていない場合、メッセージ本体は設定されず、WebSphere MQフォーマット・ヘッダー・フィールドはMQFMT_NONEとなります。
標準型メッセージに小さい値セットと大きい値セット(空ではないSYS.MGW_BASIC_MSG_T.TEXT_BODY.small_valueおよびSYS.MGW_BASIC_MSG_T.TEXT_BODY.large_value)の両方があるTEXT本体が含まれる場合は、メッセージ変換は失敗します。
標準型メッセージに小さい値セットと大きい値セット(空ではないSYS.MGW_BASIC_MSG_T.RAW_BODY.small_valueおよびSYS.MGW_BASIC_MSG_T.RAW_BODY.large_value)の両方があるRAW本体が含まれる場合は、メッセージ変換は失敗します。
ジョブ・オプションPreserveMessageIDが値TRUEに指定されている場合、WebSphereメッセージ・ヘッダーのcorrelationIdフィールドはAQのソース・メッセージ識別子に設定されます。correlationIdの値は"AQMSGID:"+AQ_msgidという書式の24バイト値で、AQ_msgidは16バイトのStreams AQメッセージ識別子を表します。
着信伝播用のメッセージ変換が指定されていない場合は、Oracle Streams Advanced Queuingの宛先キューのペイロード型は、SYS.MGW_BASIC_MSG_TまたはRAWである必要があります。メッセージ変換が指定されている場合、変換のソースのユーザー定義型はSYS.MGW_BASIC_MSG_Tである必要がありますが、宛先のユーザー定義型はOracle Streams Advanced Queuingによってサポートされている任意のユーザー定義型が有効です。
Oracle Streams Advanced QueuingキューのペイロードがRAWで、着信WebSphere MQメッセージにMQFMT_STRINGのformatが含まれる場合、メッセージ変換は失敗します。そうでない場合は、メッセージ本体はRAWバイトとみなされ、宛先キューに直接エンキューされます。バイト数が32KBを超える場合は、メッセージ変換は失敗します。実際の限度は、32767バイトではなく32512バイトです。
Oracle Streams Advanced Queuingキューのペイロードまたは変換ソースのユーザー定義型がSYS.MGW_BASIC_MSG_Tの場合、WebSphere MQメッセージは次のようにSYS.MGW_BASIC_MSG_Tメッセージにマップされます。
特定のWebSphere MQのヘッダー・フィールドは、前に説明したようにOracle Streams Advanced Queuingのメッセージ・プロパティにマップされます。
標準型メッセージのSYS.MGW_BASIC_MSG_T.header属性は、表20-1に示すとおり、WebSphere MQヘッダー・フィールドに基づいて{名前, 値}の組に設定されます。これらの値は、WebSphere MQのメッセージ・ヘッダーの当初の内容を保持します。
WebSphere MQのformatヘッダー・フィールドがMQFMT_STRINGの場合、WebSphere MQのメッセージ本体はテキストとして処理され、その値はSYS.MGW_BASIC_MSG_T.text_bodyにマップされます。他のformat値の場合、メッセージ本体はRAWバイトとして処理され、その値はSYS.MGW_BASIC_MSG_T.raw_bodyにマップされます。
MGWでは、TIB/Rendezvousメッセージはフィールドのセットおよび追加情報とみなされます。図20-4は、MGWとTIB/Rendezvousの間におけるメッセージの変換方法を示したものです。
メッセージ変換障害が発生すると、メッセージはMGWによって、ソース・キュー内の残りのメッセージの伝播を続行できるように例外キュー(例外キューがある場合)に移されます。TIB/Rendezvousからの着信伝播では、例外キューは登録済サブジェクトです。
TIB/RendezvousのフィールドのTIB/Rendezvousのワイヤ・フォーマットのデータ型は、符号のない整数およびネストされたメッセージ型以外はすべてサポートされています。今回のリリースでは、ユーザー定義のカスタム・データ型はサポートされていません。メッセージにサポートされていないデータ型のデータが含まれる場合は、処理時にメッセージ変換障害が発生します。メッセージ変換障害が発生すると、例外キューがある場合は、失敗したメッセージはソース・キューから例外キューに移されます。
表20-3は、MGWがTIB/Rendezvousの固有メッセージと標準のユーザー定義型とで変換を行う場合に使用されるデータ型マッピングを示したものです。サポートされているTIB/Rendezvousの各ワイヤ・フォーマット型に対して、データの格納に使用されるOracleタイプおよびその型を表すDBMS_MGWMSG定数が示されています。
表20-3 TIB/Rendezvousデータ型のマッピング
| TIB/Rendezvousワイヤ・フォーマット | Oracleタイプ | ユーザー定義型フィールド型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
未サポート |
未サポート |
|
|
|
|
|
|
|
|
|
|
|
|
Oracle Streams Advanced QueuingとTIB/Rendezvous間の伝播に対しては、MGWではOracle Streams Advanced Queuingのペイロード型RAWとSYS.MGW_TIBRV_MSG_Tを直接サポートしています。その他のOracle Streams Advanced Queuingのペイロード型をサポートするには、変換を指定する必要があります。
この項では、Oracle Streams AQのメッセージ・プロパティとTIB/Rendezvousのフィールドの間のマッピングについて説明します。このマッピングを使用して、発信伝播中にはStreams AQメッセージ・プロパティが保持され、着信伝播中にはStreams AQメッセージ・プロパティが設定されます。
表20-4は、TIB/Rendezvousのフィールドを使用してサポートされているStreams AQメッセージ・プロパティを示したものです。第1列は、Streams AQメッセージ・プロパティのDBMS_AQ.MESSAGE_PROPERTIES_Tフィールドを示します。第2列と第3列は、TIB/Rendezvousのフィールドに使用される名前とデータ型を示します。最後の列は、メッセージ・プロパティが着信伝播と発信伝播に対してサポートされているかどうかを示します。
表20-4 Oracle Streams Advanced Queuingメッセージ・プロパティに対するTIB/RendezvousおよびMGWの名前
| Oracle Streams Advanced Queuingメッセージ・プロパティ | MGWの名前 | TIB/Rendezvousワイヤ・フォーマット・データ型 | 用途 |
|---|---|---|---|
|
|
|
|
発信、着信 |
|
|
|
|
発信、着信 |
|
|
|
|
発信、着信 |
|
|
|
|
発信、着信 |
|
|
|
|
発信、着信 |
|
|
|
|
発信 |
|
|
|
|
発信 |
|
|
|
|
発信 |
表20-4に関する注意
Streams AQプロパティmsgidは、DBMS_AQ.MESSAGE_PROPERTIES_Tレコードの特定のフィールドではなくStreams AQメッセージ識別子を表します。
発信伝播に対する伝播変換が指定されていない場合は、Oracle Streams Advanced Queuingのソース・キューのペイロード型は、SYS.MGW_TIBRV_MSG_TまたはRAWである必要があります。伝播変換が指定されている場合、変換のターゲットのユーザー定義型はSYS.MGW_TIBRV_MSG_Tである必要がありますが、ソースのユーザー定義型はOracle Streams Advanced Queuingによってサポートされている任意のユーザー定義型が有効です。
Oracle Streams Advanced Queuingキューのペイロードまたは変換ターゲットのユーザー定義型がSYS.MGW_TIBRV_MSG_Tの場合は、次のようになります。
ソース・メッセージのすべてのフィールドは、TIB/Rendezvousから取得されるメッセージのTIB/Rendezvousメッセージ・フィールドに変換されます。
reply_subject属性がNULLではない場合は、応答サブジェクトの追加情報が設定されます。
send_subjectフィールドは無視されます。
Oracle Streams Advanced QueuingキューのペイロードがRAWの場合は、次のようになります。
結果メッセージには、値がTibrvMsg.OPAQUEでMGW_RAW_MSGという名前のフィールドが含まれます。フィールドIDは0に設定されます。
ジョブ・オプションAQ_MsgPropertiesが値TRUEに指定されている場合は、MGWエージェントによって、TIB/Rendezvousメッセージの各Streams AQメッセージ・プロパティを保持するフィールドが表20-4に従って生成されます。
ジョブ・オプションPreserveMessageIDが値TRUEに指定されている場合、Streams AQメッセージID(msgid)は表20-4に従ってTIB/Rendezvousメッセージに保持されます。
着信伝播に対する伝播変換が指定されていない場合、Oracle Streams Advanced Queuingの宛先キューのペイロード型はRAWまたはSYS.MGW_TIBRV_MSG_Tである必要があります。伝播変換が指定されている場合、変換ターゲットのユーザー定義型にはOracle Streams Advanced Queuingでサポートされている任意のユーザー定義型が有効ですが、変換ソースのユーザー定義型はSYS.MGW_TIBRV_MSG_Tである必要があります。
Oracle Streams Advanced Queuingキューのペイロードまたは変換ソースのユーザー定義型がSYS.MGW_TIBRV_MSG_Tの場合は、次のようになります。
TIB/Rendezvousのソース・メッセージの個々のフィールドは、結果としてSYS.MGW_TIBRV_MSG_T型のメッセージのフィールドに変換されます。
MGWエージェントによって、TIB/Rendezvousのソース・メッセージから送信サブジェクト名を抽出し、SYS.MGW_TIBRV_MSG_Tにsend_subject属性を設定します。通常、送信サブジェクト名は登録済の伝播ソース・キューのサブジェクト名と同じですが、ワイルドカードを使用する場合は異なる場合があります。
MGWエージェントによって、TIB/Rendezvousのソース・メッセージから応答サブジェクト名を抽出し、SYS.MGW_TIBRV_MSG_Tにreply_subject属性を設定します。
TIB/Rendezvousのソース・メッセージに3つを超える大きなテキスト・フィールド(4000バイトを超えるテキスト)または3つを超える大きなバイト・フィールド(2000バイトを超える)が含まれる場合は、メッセージ変換は失敗します。
Oracle Streams Advanced QueuingキューのペイロードがRAWの場合は、次のようになります。
TIB/Rendezvousのソース・メッセージにTibrvMsg.OPAQUE型またはTibrvMsg.XML型のMGW_RAW_MSGという名前のフィールドが含まれる場合、Oracle Streams Advanced Queuingのメッセージ・ペイロードはフィールド・データです。フィールド名とIDは無視されます。該当するフィールドがない、またはフィールドの型が予想したものと異なる場合は、メッセージ変換障害が発生します。
RAWデータ・サイズが32KBを超える場合は、メッセージ変換障害が発生します。これは、バインド変数に許可されたデータ・サイズ制限によるものです。また、実際の限度は32767ではなく32512です。
ジョブ・オプションAQ_MsgPropertiesが値TRUEで指定されている場合は、MGWエージェントによって、TIB/Rendezvousの当初のメッセージの中から予約したフィールド名のフィールドが検索されます。表20-4は、フィールド名文字列とTIB/Rendezvousのメッセージで使用される対応する値を示したものです。
該当するフィールドがある場合は、MGWエージェントでは、デフォルト値ではなくフィールド値を使用して対応するOracle Streams Advanced Queuingのメッセージ・プロパティが設定されます。同じ名前のフィールドが複数ある場合は、最初のフィールドのみが使用されます。Oracle Streams Advanced Queuingのキュー・ペイロードがRAWの場合のみ、フィールドが結果のペイロードから削除されます。予約名のあるフィールドのデータ型が予想したものと異なる場合は、メッセージ変換障害が発生します。
|
関連項目: データ型の値は、『PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_MGWMSGに関する項を参照してください。 |
MGWではメッセージの内容を変更することなく、Oracle JMSシステムとOracle JMS以外のシステム間でJMSメッセージのみを伝播します。図20-5は、JMSメッセージ伝播を示したものです。
MGWでは、標準のJMSメッセージ・タイプのみサポートしています。次のものはサポートしていません。
JMSプロバイダの拡張機能。これらの拡張機能は宛先JMSシステムで認識されないためです。このようなJMS以外のメッセージの伝播を試みると、エラー・メッセージが表示されます。
JMS伝播用のユーザー変換。
論理変更レコード(LCR)の伝播。
この説明のために、JMSメッセージは5つのJMSメッセージ・インタフェースの1つを実装するクラスのJavaオブジェクトとします。表20-5は、JMSメッセージ・インタフェースと対応するOracle JMSのユーザー定義型を示したものです。また表には、5つの特定の型のいずれかであるインタフェースのjavax.jms.Message、および一般的なOracle JMS型のSYS.AQ$_JMS_MESSAGEも示します。
表20-5 Oracle JMSメッセージの変換
| JMSメッセージ | ユーザー定義型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
伝播ジョブを有効にするとMGWエージェントによって、伝播ソースまたは宛先に対するOracle Streams Advanced Queuingのペイロード型がチェックされます。型が、表20-5に示した型またはANYDATAである場合は、メッセージ伝播が実行されます。そうでない場合は、例外が記録され伝播は実行されません。
MGWエージェントが、OracleMGW_OriginalMessageIDというJMS Stringプロパティを宛先キューに送信されたJMSメッセージに追加する場合があります。これは、ソース・メッセージの元のメッセージ識別子を保持するためです。このプロパティは、PreserveMessageIDジョブ・オプションがTRUEという値で指定された場合に追加されます。また、メッセージの変換が失敗した際に例外キューに移動されるすべてのメッセージにも追加されます。
Oracle Streams Advanced Queuingキューからメッセージをデキューすると、Oracle JMSによって表20-5に示すユーザー定義型のインスタンスがJMSメッセージに変換されます。さらに、ANYDATAのインスタンスを内容に応じてJMSメッセージに変換できます。
ペイロード型ANYDATAのキューは、JMSメッセージにマップされないメッセージを保持できます。MGWではメッセージのデキューはできません。エラーが記録され、そのキューからのメッセージの伝播はメッセージが削除されるまで続行されません。