この章では、Oracle Messaging Gateway(MGW)で、あるメッセージ・システムから他のシステムにメッセージ・フォーマットを変換する方法を説明します。メッセージ・システムによってメッセージ・フォーマットが異なるため、メッセージをOracle Streams AQと他のシステム間で移動する場合は、通常、変換が必要になります。Java Message Service(JMS)メッセージは特別なケースです。JMSメッセージは、JMS宛先へのみ伝播できます。変換プロセスは容易です。
内容は次のとおりです。
MGWでは、伝播中に、ソース側メッセージ・システム固有のメッセージ・フォーマットが宛先側メッセージ・システム固有のメッセージ・フォーマットに変換されます。MGWでは、標準型およびOracle Streams AQベースのモデルを使用して変換が行われます。
MGWによってメッセージが伝播される場合、メッセージはソース・キュー・システム固有のフォーマットから宛先キュー・システム固有のフォーマットに変換されます。
通常、システム固有のメッセージには、メッセージ・ヘッダーおよびメッセージ本体が含まれます。ヘッダーには、Oracle Streams AQのメッセージ・プロパティ、WebSphere MQの固定ヘッダーなどの固定ヘッダー・フィールドが含まれます。このフィールドは、メッセージ・システム内のすべてのメッセージに存在します。本体には、Oracle Streams AQのペイロード、WebSphere MQのメッセージ本体またはTIB/Rendezvousのすべてのメッセージなどのメッセージの内容が含まれます。MGWでは、メッセージ・ヘッダーおよびメッセージ本体の両方の構成要素が変換されます。
図20-1は、2つのステージでJMS以外のメッセージを変換する方法を示したものです。メッセージは、最初にソース・キューのシステム固有のフォーマットからMGWの内部メッセージ・フォーマットに変換され、次に、内部メッセージ・フォーマットから宛先キューのシステム固有のフォーマットに変換されます。
MGWエージェントでは、Oracle Streams AQのメッセージ・プロパティに類似したヘッダーと、MGWの標準型で表される本体で構成された、内部メッセージ・フォーマットが使用されます。
MGWでは標準型が定義され、Oracle Streams AQと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 AQメッセージ・プロパティと、同じセマンティクスのOracle Streams AQメッセージ・プロパティに対応する値を含むOracle以外のメッセージ・ヘッダー・フィールドとの間で、デフォルトのマッピングが行われます。MGWによってマッピングが行われない場合、メッセージ・ヘッダー・フィールドはデフォルト値(通常、メッセージ・システムによって定義されたデフォルト値)に設定されます。
Oracle Streams AQメッセージ間で変換する場合、MGWエージェントでは通常、標準型のみが使用されます。ただし、任意のペイロード型は、Oracle Streams AQのキュー・ペイロードとMGW標準型間で変換するために、ユーザー定義のOracle Streams AQのメッセージ変換機能によってサポートされます。
任意のADTペイロード(発信伝播)によってOracle Streams AQのキューからメッセージを伝播するMGWには、MGWの標準ユーザー定義型に対するマッピングが必要です。変換は、MGWエージェントによってOracle Streams AQのキューからメッセージがデキューされると起動されます。同様に、任意のユーザー定義型ペイロード(着信伝播)によってOracle Streams AQのキューにメッセージを伝播するMGWには、MGWの標準ユーザー定義型からのマッピングが必要です。変換は、MGWエージェントによってOracle Streams AQのキューにメッセージがエンキューされると起動されます。
変換は常にMGWエージェントとの関連で実行されますが、これはMGWエージェント・ユーザー(DBMS_MGWADM
.CREATE_AGENT
またはDBMS_MGWADM
.ALTER_AGENT
を使用して指定したユーザー)には、変換ファンクションおよびOracle Streams AQペイロード型に対する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
を作成します。このジョブに対して、変換mgwuser.sample_adt_to_mgw_basic
を使用して、Oracle Streams AQキューmgwuser.srcq
からOracle以外のメッセージ・システム・キューdestq@mqlink
にメッセージが伝播されます。
例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は、MGW WebSphere MQドライバで標準型SYS.MGW_BASIC_MSG_T
を使用して実行されるメッセージ変換を示したものです。発信伝播の場合、ドライバによって、Oracle Streams AQメッセージ・プロパティおよび標準型メッセージが、固定ヘッダーおよびメッセージ本体を含むWebSphere MQシステム固有のメッセージにマップされます。着信伝播の場合、ドライバによって、システム固有のメッセージが一連のOracle Streams AQメッセージ・プロパティおよび標準型メッセージにマップされます。標準型が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_openMessageOptions
キュー・オプションにMQOO_SET_CONTEXT
を含める必要があります。
MGWエージェントによって、指定可能なすべての値にMQPMO_SYNCPOINT
という値が追加されます。
MGWによって、次の2つのWebSphere MQのメッセージ・ヘッダー・フィールドのデフォルト値が設定されます。messageType
のデフォルト値はMQMT_DATAGRAM
に、putMessageOptions
のデフォルト値はMQPMO_SYNCPOINT
に設定されます。
MGWには、Oracle Streams AQのメッセージ・プロパティとWebSphere MQのヘッダー・フィールド間の2つのデフォルト・マッピングがあります。
1つは、キュー内でメッセージが使用可能になったときのメッセージのTime-to-Liveを表すOracle Streams AQのメッセージ・プロパティのexpiration
を、メッセージのTime-to-Liveを表すWebSphere MQのヘッダー・フィールドのexpiry
にマップします。発信伝播の場合、expiry
に使用する値はキュー内でメッセージが使用可能になった時刻をexpiration
から引き算し、10分の1秒単位の値に変換します。Oracle Streams AQ値のNEVER
は、MQEI_UNLIMITED
にマップされます。着信伝播の場合、expiration
は単に秒単位に変換されたexpiry
です。WebSphere MQ値のMQEI_UNLIMITED
は、NEVER
にマップされます。
その他のデフォルトは、Oracle Streams AQのメッセージ・プロパティのpriority
をWebSphere MQのヘッダー・フィールドのpriority
とともにマップします。表20-2で説明します。
表20-2 伝播のデフォルト優先順位のマッピング
伝播型 | メッセージ・システム | 優先順位の値 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
発信 | Oracle Streams AQ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
発信 | WebSphere MQ | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
着信 | Oracle Streams AQ | 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 AQ優先順位は、WebSphere MQ優先順位9にマップされ、9より大きいOracle Streams AQ優先順位はWebSphere MQ優先順位0にマップされます。 |
発信伝播用のメッセージ変換が指定されていない場合は、Oracle Streams AQのソース・キューのペイロード型は、SYS.MGW_BASIC_MSG_T
またはRAW
である必要があります。メッセージ変換が指定されている場合、変換のターゲットのユーザー定義型はSYS.MGW_BASIC_MSG_T
である必要がありますが、ソースのユーザー定義型はOracle Streams AQによってサポートされている任意のユーザー定義型が有効です。
Oracle Streams AQキューのペイロードがRAWの場合、WebSphere MQから取得されるメッセージには、RAWバイトの値に設定されたメッセージ本体と、デフォルトでは「MGW_Byte
」値に設定されたformat
フィールドがあります。
Oracle Streams AQキューのペイロードまたは変換ターゲットのユーザー定義型がSYS.MGW_BASIC_MSG_T
の場合、メッセージは次のようにWebSphere MQの固有メッセージにマップされます。
WebSphere MQの固定ヘッダー・フィールドは、「WebSphere MQメッセージ・ヘッダーのマッピング」で説明されているように、標準型メッセージの内部Oracle Streams AQメッセージ・プロパティおよびSYS.MGW_BASIC_MSG_T.header
属性に基づいています。
標準型メッセージにTEXT
本体がある場合は、WebSphere MQのフォーマット・ヘッダー・フィールドは、ヘッダー・プロパティMGW_MQ_format
によってオーバーライドされないかぎりMQFMT_STRING
に設定されます。メッセージ本体はテキストとみなされます。
標準型メッセージにRAW
本体がある場合は、WebSphere MQのフォーマット・ヘッダー・フィールドは、ヘッダー・プロパティMGW_MQ_format
によってオーバーライドされないかぎりMGW_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 AQの宛先キューのペイロード型は、SYS.MGW_BASIC_MSG_T
またはRAW
である必要があります。メッセージ変換が指定されている場合、変換のソースのユーザー定義型はSYS.MGW_BASIC_MSG_T
である必要がありますが、宛先のユーザー定義型はOracle Streams AQによってサポートされている任意のユーザー定義型が有効です。
Oracle Streams AQキューのペイロードがRAW
で、着信WebSphere MQメッセージにMQFMT_STRING
のformat
が含まれる場合、メッセージ変換は失敗します。そうでない場合は、メッセージ本体はRAWバイトとみなされ、宛先キューに直接エンキューされます。バイト数が32KBを超える場合は、メッセージ変換は失敗します。実際の限度は、32767バイトではなく32512バイトです。
Oracle Streams AQキューのペイロードまたは変換ソースのユーザー定義型がSYS.MGW_BASIC_MSG_T
の場合、WebSphere MQメッセージは次のようにSYS.MGW_BASIC_MSG_T
メッセージにマップされます。
特定のWebSphere MQのヘッダー・フィールドは、前に説明したようにOracle Streams AQのメッセージ・プロパティにマップされます。
標準型メッセージの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タイプ | ユーザー定義型フィールド型 |
---|---|---|
Bool
|
NUMBER
|
TIBRVMSG_BOOL
|
F32
|
NUMBER
|
TIBRVMSG_F32
|
F64
|
NUMBER
|
TIBRVMSG_F64
|
I8
|
NUMBER
|
TIBRVMSG_I8
|
I16
|
NUMBER
|
TIBRVMSG_I16
|
I32
|
NUMBER
|
TIBRVMSG_I32
|
I64
|
NUMBER
|
TIBRVMSG_I64
|
U8
|
未サポート | 未サポート |
U16
|
未サポート | 未サポート |
U32
|
未サポート | 未サポート |
U64
|
未サポート | 未サポート |
IPADDR32
|
VARCHAR2
|
TIBRVMSG_IPADDR32
|
IPPORT16
|
NUMBER
|
TIBRVMSG_IPPORT16
|
DATETIME
|
DATE
|
TIBRVMSG_DATETIME
|
F32ARRAY
|
SYS.MGW_NUMBER_ARRAY_T
|
TIBRVMSG_F32ARRAY
|
F64ARRAY
|
SYS.MGW_NUMBER_ARRAY_T
|
TIBRVMSG_F64ARRAY
|
I8ARRAY
|
SYS.MGW_NUMBER_ARRAY_T
|
TIBRVMSG_I8ARRAY
|
I16ARRAY
|
SYS.MGW_NUMBER_ARRAY_T
|
TIBRVMSG_I16ARRAY
|
I32ARRAY
|
SYS.MGW_NUMBER_ARRAY_T
|
TIBRVMSG_I32ARRAY
|
I64ARRAY
|
SYS.MGW_NUMBER_ARRAY_T
|
TIBRVMSG_I64ARRAY
|
U8ARRAY
|
未サポート | 未サポート |
U16ARRAY
|
未サポート | 未サポート |
U32ARRAY
|
未サポート | 未サポート |
U64ARRAY
|
未サポート | 未サポート |
MSG
|
未サポート | 未サポート |
OPAQUE
|
RAW またはBLOB
|
TIBRVMSG_OPAQUE
|
STRING
|
VARCHAR2 またはCLOB
|
TIBRVMSG_STRING
|
XML
|
RAW またはBLOB
|
TIBRVMSG_XML
|
Oracle Streams AQとTIB/Rendezvous間の伝播に対しては、MGWではOracle Streams AQのペイロード型RAW
とSYS.MGW_TIBRV_MSG_T
を直接サポートしています。その他のOracle Streams AQのペイロード型をサポートするには、変換を指定する必要があります。
この項では、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 AQメッセージ・プロパティに対するTIB/RendezvousおよびMGWの名前
Oracle Streams AQメッセージ・プロパティ | MGWの名前 | TIB/Rendezvousワイヤ・フォーマット・データ型 | 用途 |
---|---|---|---|
priority
|
MGW_AQ_priority
|
TibrvMsg.I32
|
発信、着信 |
expiration
|
MGW_AQ_expiration
|
TibrvMsg.I32
|
発信、着信 |
delay
|
MGW_AQ_delay
|
TibrvMsg.I32
|
発信、着信 |
correlation
|
MGW_AQ_correlation
|
TibrvMsg.STRING
|
発信、着信 |
exception_queue
|
MGW_AQ_exception_queue
|
TibrvMsg.STRING
|
発信、着信 |
enqueue_time
|
MGW_AQ_enqueue_time
|
TibrvMsg.DATETIME
|
発信 |
original_msgid
|
MGW_AQ_original_msgid
|
TibrvMsg.OPAQUE
|
発信 |
msgid (1)
|
MGW_AQ_messageID
|
TibrvMsg.OPAQUE
|
発信 |
表20-4に関する注意
Streams AQプロパティmsgid
は、DBMS_AQ.MESSAGE_PROPERTIES_T
レコードの特定のフィールドではなくStreams AQメッセージ識別子を表します。
発信伝播に対する伝播変換が指定されていない場合は、Oracle Streams AQのソース・キューのペイロード型は、SYS.MGW_TIBRV_MSG_T
またはRAW
である必要があります。伝播変換が指定されている場合、変換のターゲットのユーザー定義型はSYS.MGW_TIBRV_MSG_T
である必要がありますが、ソースのユーザー定義型はOracle Streams AQによってサポートされている任意のユーザー定義型が有効です。
Oracle Streams AQキューのペイロードまたは変換ターゲットのユーザー定義型がSYS.MGW_TIBRV_MSG_T
の場合は、次のようになります。
ソース・メッセージのすべてのフィールドは、TIB/Rendezvousから取得されるメッセージのTIB/Rendezvousメッセージ・フィールドに変換されます。
reply_subject
属性がNULL
ではない場合は、応答サブジェクトの追加情報が設定されます。
send_subject
フィールドは無視されます。
Oracle Streams AQキューのペイロードが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 AQの宛先キューのペイロード型はRAW
またはSYS.MGW_TIBRV_MSG_T
である必要があります。伝播変換が指定されている場合、変換ターゲットのユーザー定義型にはOracle Streams AQでサポートされている任意のユーザー定義型が有効ですが、変換ソースのユーザー定義型はSYS.MGW_TIBRV_MSG_T
である必要があります。
Oracle Streams AQキューのペイロードまたは変換ソースのユーザー定義型が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 AQキューのペイロードがRAW
の場合は、次のようになります。
TIB/Rendezvousのソース・メッセージにTibrvMsg.OPAQUE
型またはTibrvMsg.XML
型のMGW_RAW_MSG
という名前のフィールドが含まれる場合、Oracle Streams AQのメッセージ・ペイロードはフィールド・データです。フィールド名とIDは無視されます。該当するフィールドがない、またはフィールドの型が予想したものと異なる場合は、メッセージ変換障害が発生します。
RAW
データ・サイズが32KBを超える場合は、メッセージ変換障害が発生します。これは、バインド変数に許可されたデータ・サイズ制限によるものです。また、実際の限度は32767ではなく32512です。
ジョブ・オプションAQ_MsgProperties
が値TRUE
で指定されている場合は、MGWエージェントによって、TIB/Rendezvousの当初のメッセージの中から予約したフィールド名のフィールドが検索されます。表20-4は、フィールド名文字列とTIB/Rendezvousのメッセージで使用される対応する値を示したものです。
該当するフィールドがある場合は、MGWエージェントでは、デフォルト値ではなくフィールド値を使用して対応するOracle Streams AQのメッセージ・プロパティが設定されます。同じ名前のフィールドが複数ある場合は、最初のフィールドのみが使用されます。Oracle Streams AQのキュー・ペイロードが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メッセージ | ユーザー定義型 |
---|---|
javax.jms.TextMessage
|
SYS.AQ$_JMS_TEXT_MESSAGE
|
javax.jms.BytesMessage
|
SYS.AQ$_JMS_BYTES_MESSAGE
|
javax.jms.MapMessage
|
SYS.AQ$_JMS_MAP_MESSAGE
|
javax.jms.StreamMessage
|
SYS.AQ$_JMS_STREAM_MESSAGE
|
javax.jms.ObjectMessage
|
SYS.AQ$_JMS_OBJECT_MESSAGE
|
javax.jms.Message
|
SYS.AQ$_JMS_MESSAGE
|
伝播ジョブを有効にするとMGWエージェントによって、伝播ソースまたは宛先に対するOracle Streams AQのペイロード型がチェックされます。型が、表20-5に示した型またはANYDATA
である場合は、メッセージ伝播が実行されます。そうでない場合は、例外が記録され伝播は実行されません。
MGWエージェントは、ソース・メッセージの当初のメッセージ識別子を保持するために、宛先キューに送信されるJMSメッセージにJMS String
プロパティOracleMGW_OriginalMessageID
を追加する場合があります。このプロパティが追加されるのは、PreserveMessageID
ジョブ・オプションが値TRUE
に指定されている場合です。また、メッセージ変換障害時に例外キューに移されたメッセージについても、このプロパティが追加されます。
Oracle Streams AQキューからメッセージをデキューすると、Oracle JMSによって表20-5に示すユーザー定義型のインスタンスがJMSメッセージに変換されます。さらに、ANYDATA
のインスタンスを内容に応じてJMSメッセージに変換できます。
ペイロード型ANYDATA
のキューは、JMSメッセージにマップされないメッセージを保持できます。MGWではメッセージのデキューはできません。エラーが記録され、そのキューからのメッセージの伝播はメッセージが削除されるまで続行されません。