ヘッダーをスキップ
Oracle® XML DB開発者ガイド
11gリリース2 (11.2)
B70200-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

Oracle Streamsアドバンスト・キューイング(AQ)には、次のデータベース統合化メッセージ・キューイング機能があります。

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

この章では、AQを使用してXMLデータを交換する方法を説明します。内容は次のとおりです。

AQとXMLの相互補完

XMLは、企業間通信の標準フォーマットとして登場しました。XMLは、ビジネス・アプリケーション間で通信されるデータを表現するだけでなく、ビジネス・ロジックの表現にも使用されています。

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

AQおよびXMLメッセージ・ペイロード

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

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

  • メッセージ管理

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

  • メッセージ変換

XMLメッセージは、AQを使用してアプリケーション間で非同期に渡されます。

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

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

    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メッセージ・ペイロード」の説明

AQを使用するメリット

AQを使用すると、異なるアプリケーション間での通信を柔軟に構成できます。 統合されたソリューションの管理、構成およびビジネス・ニーズの変化に伴う変更が容易になります。複雑な業務トランザクションを実行するための、複数のアプリケーションの協調、調整、同期化が可能になります。

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

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

Oracle StreamsおよびAQ

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

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

Streamsを使用して、次の操作を実行できます。

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

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

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

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

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

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

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

Streamsを使用すると、ユーザー・アプリケーションは次の操作を実行できます。

  • 様々な型のメッセージのエンキュー

  • 使用可能なメッセージの伝播

  • 宛先データベースでのメッセージのデキュー

Streamsでは、SYS.AnyData型のメッセージをステージングする新しいタイプのキューが導入されています。ほぼすべての型のメッセージをSYS.AnyDataラッパーでラップし、SYS.AnyDataキューにステージングできます。Streamsは、Advanced Queuing (AQ)と相互に作用します。これによって、マルチ・コンシューマ・キュー、パブリッシュとサブスクライブ、コンテンツ・ベースのルーティング、インターネット伝播、変換、他のメッセージ・サブシステムへのゲートウェイなど、メッセージ・キューイング・システムのすべての標準機能がサポートされます。


関連項目:

『Oracle Streams概要および管理』およびその付録Aの「LCRのXML Schema」を参照してください。

オブジェクト型のXMLType属性

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

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

  • 文書をCLOB値として内部的に格納する。

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

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

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

Internet Data Access Presentation(iDAP)

SOAPを使用して、インターネット上でAQにアクセスできます。Internet Data Access Presentation (iDAP)は、AQ操作に対するSOAP仕様です。iDAPによって、SOAPリクエストの本体に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です。


    関連項目:

    『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

iDAPアーキテクチャ

図37-2に、HTTPまたはHTTPSメッセージを送信するために必要な次のコンポーネントを示します。

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

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

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

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

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

XMLTypeキュー・ペイロード

XMLType 属性を含むペイロードを持つキューを作成できます。これらのペイロードは、XML文書を含むメッセージの転送および格納に使用できます。XMLType属性を持つOracleオブジェクトを定義すると、次の操作を実行できます。

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

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

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

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

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

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

例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では変換を作成し、例37-3でそれを適用します。

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

CREATE OR REPLACE FUNCTION convert_to_order_xml(input_order ORDER_TYP)
  RETURN XMLType AS
    new_order XMLType;
BEGIN
  SELECT sys_xmlgen(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;
/

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

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

例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;
/

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

この項では、XMLおよびOracle Streamsアドバンスト・キューイングを使用する場合のガイドラインについて説明します。

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

Oracle Streamsアドバンスト・キューイングを使用して、企業間でXML文書を交換できます。受信または送信される各メッセージには、XMLヘッダー、XMLアタッチメント(XMLデータ・ストリーム)、DTDおよびPDFファイルが含まれ、データをqueuetableのようなデータベース表に格納できます。メッセージは、1つのレコードまたは1つのピースとしてOracleキュー表にエンキューできます。または、メッセージを複数のレコード(XMLデータ・ストリームに対するCLOB型としての1つのレコード、PDFファイルに対するRAWとしての1つのレコードなど)としてエンキューできます。メッセージのデキューもできます。

次の方法で可能です。

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

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

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

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

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

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

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

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

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

Oracle Streams AQは、オブジェクトのエンキューおよびデキューをサポートします。これらのオブジェクトは、メタデータ属性に加えて、XML文書を含むXMLType型の属性を持つことができます。詳細および例は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。

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

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

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

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

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

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

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

AQでのHTTPSの使用

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


関連項目:

『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

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

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

iDAPとSOAPの比較

iDAPは、AQ操作に対するSOAP仕様です。iDAPは、Oracle Streams AQ操作に対するXML仕様です。SOAPは、サービスを起動するための共通のメカニズムを定義します。iDAPは、AQ操作を実行するためのメカニズムを定義します。

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

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

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