Oracle Streamsアドバンスト・キューイング(AQ)には、次のデータベース統合化メッセージ・キューイング機能があります。
Oracle Databaseとメッセージ・キューイングの統合により、メッセージ・キューイングにOracle Databaseの整合性、信頼性、リカバリ能力、スケーラビリティ、パフォーマンスおよびセキュリティ機能が追加されます。また、メッセージ・フローからのインテリジェント機能の抽出が容易になります。
この章では、AQを使用してXMLデータを交換する方法を説明します。この章の内容は次のとおりです。
XMLは、企業間通信の標準フォーマットとして登場しました。XMLは、ビジネス・アプリケーション間で通信されるデータを表現するだけでなく、XMLでカプセル化されたビジネス・ロジックの表現にも使用されています。
Oracle Databaseでは、AQによって、ネイティブなXMLメッセージがサポートされ、AQ操作をXMLベースのInternet-Data-Access-Presentation(iDAP)形式で定義できます。拡張可能なメッセージの起動プロトコルであるiDAPは、インターネット標準に基づいて構築され、転送メカニズムとしてHTTPまたはHTTPSプロトコルおよび電子メール・プロトコルを使用し、データ表示用の言語としてXMLを使用します。クライアントは、iDAPを使用してAQにアクセスできます。
図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メッセージを直接データベースへ伝播するアプリケーション
この図は、AQクライアントが、OCI、JavaまたはPL/SQLを使用してデータにアクセスできることも示しています。
図37-1 Oracle Streamsアドバンスト・キューイングおよびXMLメッセージ・ペイロード
今日の企業が直面している重大な問題の1つは、アプリケーションの統合です。アプリケーションの統合とは、複雑な業務トランザクションを実行するために複数の部門アプリケーションを協調、調整および同期化することです。
AQは、アプリケーション統合のためのハブ・アンド・スポーク・アーキテクチャを可能にします。このアーキテクチャを使用すると、統合化ソリューションの管理、構成およびビジネス・ニーズの変化に伴う変更が容易になります。
Oracle Streams(Streams)を使用すると、ストリーム内のデータおよびイベントを共有できます。ストリームは、この情報をデータベース内またはデータベース間で伝播できます。ストリームは、指定された情報を指定された宛先にルーティングします。これによって、イベントを取得および管理し、他のデータベースおよびアプリケーションとイベントを共有するための従来のソリューションより、機能性と柔軟性が向上します。
Streamsを使用すると、あるソリューションを使用したために別のソリューションが使用できなくなるということがなくなります。Streamsを使用すると、分散した企業とアプリケーション、データ・ウェアハウスおよび高可用性ソリューションを構築および操作できます。Oracle Streamsのすべての機能は同時に使用できます。
Streamsを使用して、次の操作を実行できます。
データベースでの変更の取得。バックグラウンドの取得プロセスが表、データベース・スキーマまたはデータベース全体に加えられた変更を取得するように構成できます。取得プロセスでは、REDOログから変更が取得され、取得された各変更が論理変更レコード(LCR)にフォーマットされます。REDOログに変更が生成されたデータベースをソース・データベースといいます。
キューへのイベントのエンキュー。Streamsキューには、LCRおよびユーザー・メッセージという2つのタイプのイベントをステージングできます。取得プロセスでは、LCRイベントが、指定したキューにエンキューされます。そのキューは、LCRイベントを同じデータベース内で共有するか、または他のデータベースと共有できます。また、ユーザー・アプリケーションを使用してユーザー・イベントを明示的にエンキューすることもできます。明示的にエンキューされたこれらのイベントは、LCRまたはユーザー・メッセージになります。
あるキューから別のキューへのイベントの伝播。これらのキューは、同じデータベース内または異なるデータベース内に存在できます。
イベントのデキュー。バックグラウンドの適用プロセスによって、イベントをデキューできます。また、ユーザー・アプリケーションを使用してイベントを明示的にデキューすることもできます。
データベースでのイベントの適用。適用プロセスがキュー内のすべてのイベントまたは指定したイベントのみを適用するように構成できます。また、適用プロセスが、ユーザー独自のPL/SQLサブプログラムをコールしてイベントを処理するように構成することもできます。
LCRイベントが適用され、他のタイプのイベントが処理されるデータベースを宛先データベースといいます。構成によっては、ソース・データベースと宛先データベースが同じ場合もあります。
Streamsを使用すると、ユーザー・アプリケーションは次の操作を実行できます。
様々な型のメッセージのエンキュー
使用可能なメッセージの伝播
宛先データベースでのメッセージのデキュー
Streamsでは、SYS.AnyData
型のメッセージをステージングする新しいタイプのキューが導入されています。ほぼすべての型のメッセージをSYS.AnyData
ラッパーでラップし、SYS.AnyData
キューにステージングできます。Streamsは、Advanced Queuing(AQ)と相互に作用します。これによって、マルチ・コンシューマ・キュー、パブリッシュとサブスクライブ、コンテンツ・ベースのルーティング、インターネット伝播、変換、他のメッセージ・サブシステムへのゲートウェイなど、メッセージ・キューイング・システムのすべての標準機能がサポートされます。
関連項目: 『Oracle Streams概要および管理』およびその付録Aの「LCRのXML Schema」を参照してください。 |
XMLType
属性を持つOracleオブジェクト型を使用するキューを作成できます。これらのキューは、XML文書であるメッセージを転送および格納するために使用できます。XMLType
を使用すると、次の操作を実行できます。
任意の型のメッセージをキューに格納する。
この文書は、CLOB
値として内部的に格納されます。
複数の型のペイロードをキューに格納する。
existsNode
などの関数を使用してXMLType
列を問い合せる。
サブスクライバ・ルールまたはデキュー条件にその演算子を指定する。
SOAPを使用して、インターネット上でAQにアクセスできます。Internet Data Access Presentation(iDAP)は、AQ操作に対するSOAP仕様です。iDAPによって、SOAPリクエストの本体にXMLメッセージ構造が定義されます。iDAPによって構造化されたメッセージは、HTTP、HTTPSまたは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アドバンスト・キューイング・ユーザーズ・ガイド』 |
図37-2に、HTTPまたはHTTPSメッセージを送信するために必要な次のコンポーネントを示します。
iDAP形式に準拠したXMLメッセージをAQサーブレットに送信するクライアント・プログラム。これには、Webブラウザなど任意のHTTPクライアントが含まれます。
Apache JServ、Tomcatなど、受信したXMLメッセージを解析するためのAQサーブレットをホストするWebサーバーまたはサーブレット・コンテナ
。
Oracle ServerまたはOracle Database。Oracle Streams AQサーブレットは、Oracle Databaseに接続し、キューに対して操作を実行します。
XMLType
属性を含むペイロードを持つキューを作成できます。これらのペイロードは、XML文書を含むメッセージの転送および格納に使用できます。XMLType
属性を持つOracleオブジェクトを定義すると、次の操作を実行できます。
複数の型のXML文書を同じキュー内に格納します。この文書は、CLOB
インスタンスとして内部的に格納されます。
existsNode
やextract
などのSQL関数を使用して、XMLType
属性を持つメッセージを選択的にデキューします。
変換を定義して、OracleオブジェクトをXMLType
に変換します。
existsNode()
やextract()
などのXMLType
メソッドを使用して、メッセージ内容を問い合せるルールベースのサブスクライバを定義します。
例37-1 XMLTypeおよびAQ: 表とキューの作成およびメッセージの変換
BooksOnlineのアプリケーションの海外向け出荷サイトでは、注文がSYS.XMLType
を使用して表現されると想定します。注文入力サイトでは、注文がOracleオブジェクトのORDER_TYP
として表現されます。
海外向けキュー表およびキューは、次のとおり作成されます。
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.XMLTtype', compatible => '8.1'); END; BEGIN DBMS_AQADM.create_queue(queue_name => 'OS_bookedorders_que', queue_table => 'OS_orders_pr_mqtab'); END;
海外向け出荷サイトの注文の表現は、注文入力サイトでの注文の表現と異なるため、メッセージが注文入力サイトから海外向け出荷サイトに伝播される前に、変換が適用されます。
/* Add a rule-based subscriber for overseas shipping to the booked-orders queues with transformation. Overseas Shipping handles orders outside the US. */ DECLARE subscriber AQ$_AGENT; BEGIN subscriber := AQ$_AGENT('Overseas_Shipping', 'OS.OS_bookedorders_que', null); DBMS_AQADM.add_subscriber( queue_name => 'OE.OE_bookedorders_que', subscriber => subscriber, rule => 'tab.user_data.orderregion = ''INTERNATIONAL''', transformation => 'OS.OE2XML'); END;
注文入力アプリケーションによって使用される型から、海外向け出荷によって使用される型への変換の定義の詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』の第8章の変換の作成に関する項を参照してください。
例37-2 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.XMLTtype; 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 := 'tab.user_data.extract( ''/ORDER_TYP/CUSTOMER/COUNTRY/text()'').getStringVal()=''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; DBMS_OUTPUT.put_line('Order for Canada - Order: ' || deq_order_data.getStringVal()); EXCEPTION WHEN no_messages THEN DBMS_OUTPUT.put_line (' ---- NO MORE ORDERS ---- '); new_orders := FALSE; END; END LOOP; END; CREATE TYPE mypayload_type as OBJECT (xmlDataStream CLOB, dtd CLOB, pdf BLOB);
この項では、XMLおよびOracle Streamsアドバンスト・キューイングを使用する場合のガイドラインについて説明します。
Oracle Streamsアドバンスト・キューイングを使用して、企業間でXML文書を交換できます。受信または送信される各メッセージには、XMLヘッダー、XMLアタッチメント(XMLデータ・ストリーム)、DTDおよびPDFファイルが含まれ、データをqueuetable
のようなデータベース表に格納できます。メッセージは、1つのレコードまたは1つのピースとしてOracleキュー表にエンキューできます。または、メッセージを複数のレコード(XMLデータ・ストリームに対するCLOB
型としての1つのレコード、PDFファイルに対するRAW
としての1つのレコードなど)としてエンキューできます。メッセージのデキューもできます。
次の方法で可能です。
CLOB
、RAW
などの属性を持つオブジェクト型を定義し、これを単一メッセージとして格納します。
AQメッセージ・グループ化機能を使用して、該当するメッセージを複数のメッセージに格納します。この場合、メッセージのプロパティは1つのグループに対応付けられます。メッセージ・グループ化機能を使用するには、すべてのメッセージのペイロード型が同じである必要があります。
ペイロードを指定するには、最初に、次の例のようにオブジェクト型を作成します。
CREATE TYPE mypayload_type as OBJECT (xmlDataStream CLOB, dtd CLOB, pdf BLOB);
次に、このオブジェクト型を単一のメッセージとして格納します。
キュー表を使用して、メッセージ割当てをサポートできます。たとえば、他の企業は、メッセージを特定の企業に送信するときに、これらのメッセージを処理するために誰が割り当てられるかは認識していません。ただし、そのメッセージが人事部宛てであることは認識しています。そのため、すべてのメッセージは人事部管理者へ送信されます。この時点で、メッセージはキュー表にエンキューされます。このメッセージの受信者は人事部管理者のみであり、その他のすべての人事部社員はこのキューのサブスクライバとして事前定義されています。
メッセージがエンキューされた後に受信者のリストを変更することはできません。受信者のリストを指定しない場合、サブスクライバはそのキューをサブスクライブし、メッセージをデキューできます。この場合は、新しい受信者がそのキューのサブスクライバである必要があります。それ以外の場合は、メッセージをデキューし、そのメッセージを新しい受信者が再度エンキューする必要があります。
Oracle Streams AQは、オブジェクトのエンキューおよびデキューをサポートします。これらのオブジェクトは、XML文書を含むXMLType
型の属性、およびメッセージとともに送信すると有用な、抽出されたメタデータ属性を持つことができます。詳細および例は、最新のAQのドキュメント『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。
XMLコンテンツを持つメッセージをOracle Streams AQキューから解析し、ODS(Operational Data Store)にある表およびフィールドを更新する必要のある場合があります。つまり、XML文書を取り出して解析し、特定のフィールドをデータベース表およびデータベース列にマップすることが必要になる場合があります。特定のXMLタグ値の問合せに基づいて、AQエンキューまたはAQデキューの回数やJMSヘッダー情報などのメタデータを取得するための最も簡単な方法は、(Oracle Database内で)Oracle Streams AQと同時に、Oracle XML Parser for JavaおよびJavaストアド・プロシージャを使用することです。
XMLをCLOBで格納する場合、Oracle Textを使用して検索できますが、この場合は、ある基準に一致する特定のメッセージのみを検索できます。
メタデータ上で集計操作を行うには、既存の関連ツールからメタデータを参照するか、または通常のSQL述語をメタデータに使用します。この場合、CLOBにXMLで格納するのみでは十分ではありません。
Oracle TextのXML検索と、抽出された列などの重複したメタデータ記憶域を組み合せ、通常のSQL述語とOracle Textのcontains
式を組み合せるSQLを使用すると、これらの両オプションの最適な機能を利用できます。
クライアントからのXMLメッセージの受信後、すぐにメッセージを処理する必要がある場合があります。各XML文書の処理には、約15秒かかります。PL/SQLでは、XML文書を処理するために、1つのプロシージャがリスナーの開始、メッセージのデキュー、別のプロシージャのコールを行い、XML文書が処理されるまで、リスナーが停止する場合があります。その間、メッセージがキューに蓄積します。
メッセージを受信後、DBMS_JOB
パッケージを使用してジョブを送信します。ジョブは、異なるデータベース・セッションで非同期に起動されます。
Oracle Databaseでは、Oracle Streams AQ通知フレームワークにPL/SQLコールバックが追加されました。これによって、メッセージがキューに入れられると非同期に起動されるPL/SQLコールバックを登録できます。
HTTPSを使用してXMLメッセージをサプライヤに送信し、レスポンスを受信するには、Oracle Streams AQのインターネット・アクセス機能を使用できます。XMLを使用して、確実なトランザクション処理でHTTPを介してメッセージをエンキューまたはデキューできます。
関連項目: 『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』 |