37 Oracle Streams AQを使用したXMLデータの交換

XMLデータは、データベース統合化メッセージ・キューイングを提供するOracle Streamsアドバンスト・キューイング(AQ)を使用して交換できます。AQは、メッセージを使用して、アプリケーション間の非同期通信を可能にし、その管理を行います。 ポイント・ツー・ポイント通信モデルおよびパブリッシュ・サブスクライブ通信モデルをサポートします。

Oracle Databaseとメッセージ・キューイングの統合により、メッセージ・キューイングにOracle Databaseの整合性、信頼性、リカバリ能力、スケーラビリティ、パフォーマンスおよびセキュリティ機能が追加されます。また、メッセージ・フローからのインテリジェント機能の抽出が容易になります。

37.1 XMLおよびOracle Streamsアドバンスト・キューイング

Oracle Streamsアドバンスト・キューイング(AQ)は、ネイティブのXMLメッセージをサポートしています。AQ操作をXMLベースのInternet-Data-Access-Presentation (iDAP)形式で定義できます。iDAPは拡張可能なメッセージの起動プロトコルです。これはインターネット標準に基づいて構築され、転送メカニズムとしてHTTP(S)および電子メール・プロトコルを使用します。XMLがiDAP用のデータ表示用の言語です。

37.1.1 Oracle Streamsアドバンスト・キューイングおよびXMLメッセージ・ペイロード

XMLメッセージは、Oracle Streamsアドバンスト・キューイング(AQ)を使用してアプリケーション間で非同期に渡すことができます。

図37-1に、AQを使用して3つのアプリケーションと通信するOracle Databaseを示します。メッセージ・ペイロードはXMLデータです。この使用例においてAQが実行する一般的なタスクは、次のとおりです。

  • サブスクリプション・ルールを使用したメッセージ・フロー

  • メッセージ管理

  • メッセージからのビジネス・インテリジェンスの抽出

  • メッセージ変換

AQを使用してアプリケーション間で非同期にXMLメッセージを渡すユースケース:

  • 企業内業務。典型的な使用例には、販売注文の遂行およびサプライチェーンの管理などがあります。

  • 企業間業務処理。複数の統合ハブが、インターネットを介して通信できます。使用例には、旅行の予約、メーカーとサプライヤ間の調整、銀行間での資金の移動、保険請求の清算などがあります。

    Oracleは、このアプローチを企業アプリケーション統合製品で使用します。XMLメッセージは、アプリケーションからAQハブへ送信されます。このハブは、メッセージを必要とするすべてのアプリケーションに対してメッセージ・サーバーとして機能します。このハブ・アンド・スポーク・アーキテクチャを介して、XMLメッセージを、疎結合された複数のアプリケーションへ非同期に送信できます。

図37-1に、AQを使用して、次のアプリケーションを介して配送したXMLペイロード・メッセージを示します。

  • iDAPを使用し、HTTPおよびHTTPS接続を介したAQ操作を行うWebベースのアプリケーション

  • Net*接続を介してXMLメッセージを伝播するために、AQを使用するアプリケーション

  • AQを使用して、HTTP、HTTPSまたはSMTPを介してインターネットまたはXMLメッセージを直接データベースへ伝播するアプリケーション

図37-1は、AQクライアントが、OCI、JavaまたはPL/SQLを使用してデータにアクセスできることも示しています。

図37-1 Oracle Streamsアドバンスト・キューイングおよびXMLメッセージ・ペイロード

図37-1の説明が続きます
「図37-1 Oracle Streamsアドバンスト・キューイングおよびXMLメッセージ・ペイロード」の説明

37.1.2 Oracle Streamsアドバンスト・キューイングを使用するメリット

Oracle Streamsアドバンスト・キューイング(AQ)によって、アプリケーション間の通信の構成の柔軟性が提供されます。統合されたソリューションの管理、構成およびビジネス・ニーズの変化に伴う変更が容易になります。複雑な業務トランザクションを実行するための、アプリケーションの協調、調整、同期化が可能になります。

AQが提供するメッセージ管理では、異なるアプリケーション間のメッセージ・フローを管理できます。AQは、監査や追跡目的、およびビジネス・インテリジェンスの抽出のためにもメッセージを保持できます。

AQは、メッセージにアクセスするためのSQLビューを提供します。これらのビューを使用して、動向を分析できます。

37.2 Oracle Streamsおよびアドバンスト・キューイング

Oracle Streamsを使用すると、ストリーム内のデータおよびイベントを共有できます。ストリームによって、データベース内またはデータベース間で情報を伝播し、指定した宛先に情報をルーティングできます。これによって、イベントを取得および管理し、他のデータベースおよびアプリケーションとイベントを共有するための機能性と柔軟性が提供されます。

Oracle Streamsを使用すると、あるソリューションを使用したために別のソリューションが使用できなくなるということがなくなります。分散した企業とアプリケーション、データ・ウェアハウスおよび高可用性ソリューションを構築および操作できます。

Oracle Streamsを使用して、次に示すすべてを実行できます。

  • データベースでの変更の取得。バックグラウンドの取得プロセスが表、データベース・スキーマまたはデータベース全体に加えられた変更を取得するように構成できます。取得プロセスでは、REDOログから変更が取得され、取得された各変更が論理変更レコード(LCR)にフォーマットされます。REDOログに変更が生成されたデータベースをソース・データベースと呼びます。

  • キューへのイベントのエンキュー。Streamsキューには、LCRおよびユーザー・メッセージという2つのタイプのイベントをステージングできます。取得プロセスでは、LCRイベントが、指定したキューにエンキューされます。そのキューは、LCRイベントを同じデータベース内で共有するか、または他のデータベースと共有できます。また、ユーザー・アプリケーションを使用してユーザー・イベントを明示的にエンキューすることもできます。明示的にエンキューされたこれらのイベントは、LCRまたはユーザー・メッセージになります。

  • あるキューから別のキューへのイベントの伝播。これらのキューは、同じデータベース内または異なるデータベース内に存在できます。

  • イベントのデキュー。バックグラウンドの適用プロセスによって、イベントをデキューできます。また、ユーザー・アプリケーションを使用してイベントを明示的にデキューすることもできます。

  • データベースでのイベントの適用。適用プロセスがキュー内のすべてのイベントまたは指定したイベントのみを適用するように構成できます。また、適用プロセスが、ユーザー独自のPL/SQLサブプログラムをコールしてイベントを処理するように構成することもできます。

    LCRイベントが適用され、他のタイプのイベントが処理されるデータベースを宛先データベースと呼びます。構成によっては、ソース・データベースと宛先データベースが同じ場合もあります。

37.2.1 Oracle Streamsのメッセージ・キューイング

Oracle Streamsにより、アプリケーションでメッセージをエンキュー、伝播およびデキューできます。

Oracle Streamsでは、SYS.AnyData型のメッセージがステージングされます。ほぼすべての型のメッセージをSYS.AnyDataラッパーでラップし、SYS.AnyDataキューにステージングできます。Oracle Streamsアドバンスト・キューイング(AQ)では、マルチ・コンシューマ・キュー、パブリッシュおよびサブスクライブ、コンテンツベースのルーティング、インターネット伝播、変換、他のメッセージ・サブシステムへのゲートウェイなど、メッセージ・キューイング・システムのすべての標準機能がサポートされます。

37.3 オブジェクト型のXMLType属性

XMLType属性を持つOracleオブジェクト型を使用するキューを作成できます。これらのキューは、XML文書であるメッセージを転送および格納するために使用できます。

XMLTypeを使用すると、次の操作を実行できます。

  • 任意の型のメッセージをキューに格納する。

  • 文書をCLOBインスタンスとして内部的に格納します

  • 複数の型のペイロードをキューに格納する。

  • XMLExistsなどのSQL/XML関数を使用してXMLType列を問い合せる。

  • サブスクライバ・ルールまたはデキュー条件にその演算子を指定する。

37.4 Internet Data Access Presentation (iDAP): AQ用のSOAP

インターネット上でSimple Object Access Protocol (SOAP)を使用してOracle Streams Advanced Queuing (AQ)にアクセスできます。Internet Data Access Presentation (iDAP)は、AQ操作に対するSOAP仕様です。iDAPは、SOAP Request BodyのXMLメッセージ構造を定義します。

iDAPによって構造化されたメッセージは、HTTP(S)またはSMTPなどの転送プロトコルを使用してインターネット上で転送されます。

iDAPは、Content-Typeのtext/xmlを使用して、SOAPリクエストの本体を指定します。XMLでは、iDAPリクエストおよびレスポンス・メッセージは、次のように表現されます。

  • すべてのリクエスト・タグおよびレスポンス・タグは、SOAP名前空間で有効です。

  • AQ操作は、iDAP名前空間で有効です。

  • 送信者は、SOAP本体のiDAP要素および属性に名前空間を含めます。

  • 受信者は、適切な名前空間を含むiDAPメッセージを処理します。不適切な名前空間を持つリクエストの場合、リクエストが無効であるというエラーを戻します。

  • SOAP名前空間の値は、http://schemas.xmlsoap.org/soap/envelope/です。

  • iDAP名前空間の値は、http://ns.oracle.com/AQ/schemas/accessです。

37.5 iDAPアーキテクチャ

HTTP(S)を使用するOracle Streamsアドバンスト・キューイング操作には、iDAP HTTPクライアント、WebサーバーおよびOracleサーバーが必要です。

図37-2に、これらのコンポーネント間の関係を示します。

  • クライアント・プログラムは、iDAP形式に準拠したXMLメッセージをAQサーブレットに送信します。これには、Webブラウザなど任意のHTTPクライアントが含まれます。

  • Webサーバーまたはサーブレット・コンテナは、Apache JServ、Tomcatなど、受信したXMLメッセージを解析するためのAQサーブレットをホストします。

  • Oracle Streams AQサーブレットは、Oracle Databaseに接続し、キュー操作を実行します。

図37-2 HTTPまたはHTTPSを使用してAQ操作を実行するためのiDAPアーキテクチャ

図37-2の説明が続きます
「図37-2 HTTPまたはHTTPSを使用してAQ操作を実行するためのiDAPアーキテクチャ」の説明

37.5.1 XMLTypeキュー・ペイロード

XMLType属性を含むペイロードを持つキューを作成できます。これらのペイロードは、XML文書を含むメッセージの転送および格納に使用できます。

XMLType属性を持つOracleオブジェクトを定義すると、次の操作を実行できます。

  • 複数の型のXML文書を同じキュー内に格納します。この文書は、CLOBインスタンスとして内部的に格納されます。

  • XMLExistsXMLQueryなどのSQL/XML関数を使用して、XMLType属性を持つメッセージを選択的にデキューします。

  • 変換を定義して、OracleオブジェクトをXMLTypeに変換します。

  • XMLExistsXMLQueryなどのSQL/XML関数を使用して、メッセージ内容を問い合せるルールベースのサブスクライバを定義します。

この例で示すアプリケーションの海外向け出荷サイトでは、注文がSYS.XMLTypeを使用して表現されると想定します。注文入力サイトでは、注文がOracleオブジェクトのORDER_TYPとして表現されます。

例37-1では、海外向け出荷用のキュー表およびキューを作成します。

海外向け出荷サイトの注文の表現は、注文入力サイトでの注文の表現と異なるため、メッセージは注文入力サイトから海外向け出荷サイトに送信される前に変換される必要があります。例37-2では変換を作成し、例37-3でそれを適用します。

注文入力アプリケーションによって使用される型から、海外向け出荷によって使用される型への変換の定義の詳細は、Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイドを参照してください。

例37-4では、別の国(この場合はカナダ)の顧客の注文を処理するアプリケーションで、メッセージをどのようにデキューできるかを示しています。

例37-1 キュー表およびキューの作成

BEGIN
   DBMS_AQADM.create_queue_table(
     queue_table        => 'OS_orders_pr_mqtab',
     comment            => 'Overseas Shipping MultiConsumer Orders queue table',
     multiple_consumers => TRUE,
     queue_payload_type => 'SYS.XMLtype',
     compatible         => '8.1');
END;
/
 
BEGIN
   DBMS_AQADM.create_queue(queue_name   => 'OS_bookedorders_que',
                           queue_table  => 'OS_orders_pr_mqtab');
END;
/

例37-2 メッセージ・データをXMLに変換するための変換の作成

CREATE OR REPLACE FUNCTION convert_to_order_xml(input_order ORDER_TYP)
  RETURN XMLType AS
    new_order XMLType;
BEGIN
  SELECT XMLElement("Row", input_order) INTO new_order FROM DUAL;
  RETURN new_order;
END convert_to_order_xml;
/
 
BEGIN
  SYS.DBMS_TRANSFORM.create_transformation(
    schema =>         'OE',
    name   =>         'OE2XML',
    from_schema =>    'OE',
    from_type =>      'ORDER_TYP',
    to_schema =>      'SYS',
    to_type =>        'XMLTYPE',
    transformation => 'convert_to_order_xml(source.user_data)');
END;
/

例37-3 メッセージを海外に送信する前の変換の適用

-- Add a rule-based subscriber for overseas shipping to the booked-orders
-- queues with transformation.
DECLARE
   subscriber SYS.AQ$_AGENT;
BEGIN
   subscriber := SYS.AQ$_AGENT('Overseas_Shipping',
                               'OS.OS_bookedorders_que',
                               NULL);
   DBMS_AQADM.add_subscriber(
     queue_name     => 'OS_bookedorders_que',
     subscriber     => subscriber,
     rule           => 'XMLSerialize(CONTENT XMLQuery(''//orderregion''' ||
                       'PASSING tab.user_data RETURNING CONTENT)' ||
                       ' AS VARCHAR2(1000)) = ''INTERNATIONAL''',
     transformation => 'OE.OE2XML');
END;
/

例37-4 XMLTypeおよびAQ: メッセージのデキュー

-- Create procedure to enqueue into single-consumer queues.
CREATE OR REPLACE PROCEDURE get_canada_orders AS
   deq_msgid             RAW(16);
   dopt                  DBMS_AQ.dequeue_options_t;
   mprop                 DBMS_AQ.message_properties_t;
   deq_order_data        SYS.XMLType;
   deq_order_data_text   CLOB;
   no_messages           EXCEPTION;
   PRAGMA EXCEPTION_INIT (no_messages, -25228);
   new_orders            BOOLEAN := TRUE;
BEGIN
   dopt.wait := 1;
   -- Specify dequeue condition to select orders for Canada.
   dopt.deq_condition := 'XMLSerialize(CONTENT ' ||
                         'XMLQuery(''/ORDER_TYP/CUSTOMER/COUNTRY/text()''' ||
                         ' PASSING tab.user_data RETURNING CONTENT)' ||
                         ' AS VARCHAR2(1000))=''CANADA''';
   dopt.consumer_name := 'Overseas_Shipping';
   WHILE (new_orders) LOOP
     BEGIN
       DBMS_AQ.dequeue(queue_name         => 'OS.OS_bookedorders_que',
                       dequeue_options    => dopt,
                       message_properties => mprop,
                       payload            => deq_order_data,
                       msgid              => deq_msgid);
       COMMIT;
       SELECT XMLSerialize(DOCUMENT deq_order_data AS CLOB)
         INTO deq_order_data_text FROM DUAL;
       DBMS_OUTPUT.put_line('Order for Canada - Order: ' || deq_order_data_text);
     EXCEPTION
       WHEN no_messages THEN
         DBMS_OUTPUT.put_line (' ---- NO MORE ORDERS  ---- ');
         new_orders := FALSE;
     END;
   END LOOP;
END;
/

37.6 XMLおよびOracle Streamsアドバンスト・キューイングを使用する場合のガイドライン

XMLデータおよびOracle Streamsアドバンスト・キューイングを使用する場合のガイドラインを示します。

37.6.1 多くのPDFファイルを持つOracle Streams AQ XMLメッセージを1つのレコードとして格納する方法

Oracle Streamsアドバンスト・キューイング(AQ)を使用して、企業間でXML文書を交換できます。各メッセージには、XMLヘッダー、XMLアタッチメント(XMLデータ・ストリーム)、DTDおよびPDFファイルが含まれます。データは、キュー表などのデータベース表に格納できます。

メッセージは、1つのレコードまたは1つのピースとしてOracleキュー表にエンキューできます。または、メッセージを複数のレコード(XMLデータ・ストリームに対するCLOB型としての1つのレコード、PDFファイルに対するRAWとしての1つのレコードなど)としてエンキューできます。メッセージのデキューもできます。

次の方法で可能です。

  • CLOBRAWなどの属性を持つオブジェクト型を定義し、これを単一メッセージとして格納します。

  • AQメッセージ・グループ化機能を使用して、該当するメッセージを複数のメッセージに格納します。この場合、メッセージのプロパティは1つのグループに対応付けられます。メッセージ・グループ化機能を使用するには、すべてのメッセージのペイロード型が同じである必要があります。

ペイロードを指定するには、最初に、次の例のようにオブジェクト型を作成します。

CREATE TYPE mypayload_type as OBJECT (xmlDataStream CLOB, dtd CLOB, pdf BLOB);

次に、このオブジェクト型を単一のメッセージとして格納します。

37.6.2 メッセージをエンキューした後の新しい受信者の追加

キュー表を使用して、メッセージ割当てをサポートできます。

たとえば、他の企業は、メッセージを特定の企業に送信するときに、これらのメッセージを処理するために誰が割り当てられるかは認識していません。ただし、そのメッセージが人事部(HR)宛てであることは認識しています。そのため、すべてのメッセージは人事部管理者へ送信されます。この時点で、メッセージはキュー表にエンキューされます。このメッセージの受信者は人事部管理者のみであり、その他のすべての人事部社員はこのキューのサブスクライバとして事前定義されています。

メッセージがエンキューされた後に受信者のリストを変更することはできません。受信者のリストを指定しない場合、サブスクライバはそのキューをサブスクライブし、メッセージをデキューできます。この場合は、新しい受信者がそのキューのサブスクライバである必要があります。それ以外の場合は、メッセージをデキューし、そのメッセージを新しい受信者が再度エンキューする必要があります。

37.6.3 XMLメッセージのエンキューおよびデキュー

Oracle Streams AQは、オブジェクトのエンキューおよびデキューをサポートします。このオブジェクトは、メタデータ属性に加えて、XML文書を含むXMLType型の属性を持つことができます。

詳細および例は、Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイドを参照してください。

37.6.4 XMLコンテンツを持つメッセージのOracle Streams AQキューからの解析

XMLコンテンツを持つメッセージをOracle Streamsアドバンスト・キューイング(AQ)キューから解析し、Operational Data Store (ODS)にある表およびフィールドを更新できます。

Oracle Streams AQと同時に、Oracle XML Parser for JavaおよびJavaストアド・プロシージャを使用すると、特定のXMLデータをターゲットにする問合せに基づいて、AQエンキューまたはAQデキューの回数やJMSヘッダー情報などのメタデータを取得できます。この方法は、Oracle Text XML検索とともに使用できます。

37.6.5 XML文書が処理されるまでのリスナー停止の回避

メッセージを受信後、PL/SQLパッケージDBMS_JOBを使用してジョブを送信できます。ジョブは、異なるデータベース・セッションで非同期に起動されます。リスナーは受信したXMLメッセージが処理されるまで待機する必要があるため、これによってメッセージがキューに蓄積するのを防ぐことができます。

クライアントからのXMLメッセージの受信後、すぐにメッセージを処理する必要がある場合があります。しかし、各XML文書は処理数秒かかります。PL/SQLでは、XML文書を処理するために、1つのプロシージャがリスナーの開始、メッセージのデキュー、別のプロシージャのコールを行います。リスナーはXML文書が処理されるまで停止し、その間メッセージがキューに蓄積されます。

メッセージを受信後、かわりにPL/SQLパッケージDBMS_JOBを使用してジョブを送信できます。ジョブは、異なるデータベース・セッションで非同期に起動されます。

メッセージがキューに入れられると非同期に起動されるPL/SQLコールバックを登録できます。PL/SQLコールバックは、 Oracle Streams AQ通知フレームワークの一部です。

37.6.6 AQによるHTTPS

HTTPSを使用してXMLメッセージをサプライヤに送信し、レスポンスを受信するために、Oracle Streamsアドバンスト・キューイング(AQ)のインターネット・アクセス機能を使用できます。確実なトランザクション処理でHTTP(S)を介してXMLメッセージをエンキューまたはデキューできます。

37.6.7 Oracle Streams AQメッセージ・ペイロードへのXMLの格納

SYS.XMLTypeが含まれるADTをペイロードとして使用する以外にも、XMLをOracle Streamsアドバンスト・キューイング(AQ)メッセージ・ペイロードにネイティブに格納できます。ペイロードとXMLType属性を持つキューを作成できます。

37.6.8 iDAPとSOAP

iDAPはOracle Streamsアドバンスト・キューイング(AQ)操作のためのSOAP仕様です。SOAPは、サービスを起動するための共通のメカニズムを定義します。iDAPは、AQ操作を実行するためのメカニズムを定義します。

iDAPには、SOAPが定義していない、次の主要なプロパティが含まれます。

  • トランザクション動作。AQ操作をトランザクションとして実行できます。トランザクションは、複数のiDAPリクエストにまたがることができます。

  • すべてのiDAP操作は、許可済ユーザーおよび認証済ユーザーのみが実行できます。