Oracle® Fusion Middleware Oracle Reports ServicesレポートWeb公開ガイド 12c (12.2.1.2) E82763-01 |
|
前 |
次 |
Oracle Advanced Queuingは、キューと2つのプロセスを中心として非同期のリクエスト/レスポンス・メカニズムを構築するための手段となります。2つのプロセスとは、MESSAGES
をキューに入れるENQUEUE
、およびキューを読み取るDEQUEUE
です。
アドバンスト・キューイングは、キュー間でメッセージを配布し、キューをサブスクライブするための高度なメカニズムを備えています。これらのメカニズムは、いずれも基本要素(ENQUEUE
、DEQUEUE
およびMESSAGES
)をベースに構築されています。
Event-Driven Publishing APIでは、これらのキューを使用してレポート・ジョブを保存および送信することができます。Oracle Reports Servicesで用意されているメカニズムが要件に適合しない場合、独自のキューイング・メカニズムも作成できます。
キューは、いくつかの管理列とメッセージを表すオブジェクト列で構成されるデータベース内の表です。ここでのメッセージは、パラメータ・リストです。
アドバンスト・キューイング付属のdbms_AQadm
パッケージには、アドバンスト・キューイング・システムの設定に必要なすべての管理ファンクションが含まれています。
データベースに物理的な表を作成するには、dbms_AQadm.Create_Queue_Table
を使用します。その場合、表の名前、およびそのキューのメッセージを定義するオブジェクト・タイプの名前を渡す必要があります。
例:
… execute dbms_AQadm.Create_Queue_Table
(queue_Table=>'queuename._tab', queue_Payload_Type=>'SRW_PARAMLIST_OBJECT', compatible=>'9.0');
前述の例で、SRW_PARAMLIST
タイプをカプセル化するオブジェクト・タイプSRW_PARAMLIST_OBJECT
をすでに作成しているので、これをメッセージとして使用できます。
キュー表を作成したら、dbms_AQadm.Create_Queue
でキューを作成し、dbms_AQadm.Start_Queue
でキューを開始する必要があります。
例:
… execute dbms_AQadm.Create_Queue
(Queue_Name=>'queuename',Queue_Table=>'queuename._tab');
prompt … starting queue execute dbms_AQadm.Start_Queue
(Queue_Name=>'queuename');
…
注意: Oracle Reports Servicesのインストールに含まれているsrwAQsetup.sql デモ・ファイルには、単純なキューの設定、作成および開始を行うために完全な例が示されています。 |
キューを作成して開始した後に必要となるのは、このキューにメッセージを作成するプロシージャと、キューを読み取ってサーバーにジョブを送信するプロシージャです。次の各項では、これらのプロシージャを説明します。
エンキュー・プロシージャは、キューにメッセージを挿入します。このプロシージャは、データベース・トリガーによってコールされるアプリケーション、または外部のメカニズムを通じて提供されるアプリケーションに組み込むことができます。この項では、このキューに単純なメッセージを挿入するストアド・プロシージャの作成例を示します。
ここでは、メッセージがパラメータ・リストそのものであるため、プロシージャはかなり簡単です。パラメータ・リストを作成するには、前述の項で使用したコードを使用します。使用した変数に加えて、キューに入れるメッセージを保持するobject
変数を定義します。
… plist_object SRW_ParamList_Object; …
パラメータ・リストを作成したら、オブジェクト・コンストラクタで実際のメッセージ・オブジェクトを作成します。
… plist_object := SRW_PARAMLIST_OBJECT(plist); …
その後に、アドバンスト・キューイング付属のエンキュー・プロシージャでメッセージをエンキューします。
… dbms_aq.enqueue(queue_name => 'myQueue',
enqueue_options => enqueue_options, message_properties => message_properties, payload => PList_Object, msgid => message_handle);
…
メッセージがキューに挿入されます。メッセージ配布は一切設定していないため、次の項で説明するデキュー・プロシージャによってフェッチされるまで、メッセージはキューに入ったままとなります。
デキュー・プロシージャは、キュー内のすべてのメッセージを読み取って処理します。ここでは、メッセージを読み取り、メッセージに添付されたパラメータ・リストを使用してサーバーにジョブを送信します。
この処理には、次の例を使用します。
BEGIN
dequeue_options.wait := 1;
loop
DBMS_AQ.DEQUEUE(queue_name => 'myQueue',
dequeue_options => dequeue_options, message_properties => message_properties, payload => PList_Object, msgid => message_handle);
COMMIT; plist := plist_object.params; r_jid := SRW.RUN_REPORT(plist);
end loop; exception when aq_timeout then
begin
NULL;
end;
END;
このサンプル・コードでは、すべてのメッセージが処理されるまでキューが読み取られます。処理に使用できる時間は、コードの2行目に定義されているタイムアウトによって決まります。このタイムアウトによって、タイムアウト例外が作成されるまでデキュー・プロシージャがメッセージを待機できる秒数が定義されます。
アドバンスト・キューイングには、メッセージを読み取るためのDBMS_AQ.DEQUEUE
ビルトインが用意されています。これは、情報を保持するオブジェクトであるメッセージのペイロードを、ペイロード・パラメータで定義されたオブジェクトに挿入します。
plist
を使用して、ペイロード・オブジェクトから情報を抽出します。すでに説明したように、ここではオブジェクトにパラメータ・リストが含まれています。これは、オブジェクト内部のPARAMS
属性に格納されています。抽出されたパラメータ・リストは、ジョブを送信するSRW.RUN_REPORT
に渡されます。