プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Reports ServicesレポートWeb公開ガイド
12c (12.2.1.2)
E82763-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

21.4 Oracle Advanced Queuingとの統合

Oracle Advanced Queuingは、キューと2つのプロセスを中心として非同期のリクエスト/レスポンス・メカニズムを構築するための手段となります。2つのプロセスとは、MESSAGESをキューに入れるENQUEUE、およびキューを読み取るDEQUEUEです。

アドバンスト・キューイングは、キュー間でメッセージを配布し、キューをサブスクライブするための高度なメカニズムを備えています。これらのメカニズムは、いずれも基本要素(ENQUEUEDEQUEUEおよびMESSAGES)をベースに構築されています。

Event-Driven Publishing APIでは、これらのキューを使用してレポート・ジョブを保存および送信することができます。Oracle Reports Servicesで用意されているメカニズムが要件に適合しない場合、独自のキューイング・メカニズムも作成できます。

21.4.1 SRW_PARAMLISTタイプのメッセージを保持するキューの作成

キューは、いくつかの管理列とメッセージを表すオブジェクト列で構成されるデータベース内の表です。ここでのメッセージは、パラメータ・リストです。

アドバンスト・キューイング付属の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デモ・ファイルには、単純なキューの設定、作成および開始を行うために完全な例が示されています。

キューを作成して開始した後に必要となるのは、このキューにメッセージを作成するプロシージャと、キューを読み取ってサーバーにジョブを送信するプロシージャです。次の各項では、これらのプロシージャを説明します。

21.4.2 エンキュー・プロシージャの作成

エンキュー・プロシージャは、キューにメッセージを挿入します。このプロシージャは、データベース・トリガーによってコールされるアプリケーション、または外部のメカニズムを通じて提供されるアプリケーションに組み込むことができます。この項では、このキューに単純なメッセージを挿入するストアド・プロシージャの作成例を示します。

ここでは、メッセージがパラメータ・リストそのものであるため、プロシージャはかなり簡単です。パラメータ・リストを作成するには、前述の項で使用したコードを使用します。使用した変数に加えて、キューに入れるメッセージを保持する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);

メッセージがキューに挿入されます。メッセージ配布は一切設定していないため、次の項で説明するデキュー・プロシージャによってフェッチされるまで、メッセージはキューに入ったままとなります。


注意:

dbms_aq.enqueueの正しい構文は、Advanced Queuing APIのリファレンス・ドキュメントで確認してください。

Oracle Reports Servicesのインストールに含まれているsrwAQsetup.sqlファイルには、その他の例が示されています。


21.4.3 デキュー・プロシージャの作成

デキュー・プロシージャは、キュー内のすべてのメッセージを読み取って処理します。ここでは、メッセージを読み取り、メッセージに添付されたパラメータ・リストを使用してサーバーにジョブを送信します。

この処理には、次の例を使用します。

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に渡されます。

このデキュー・プロシージャを手動で起動しないようにするには、データベース内部でジョブとして実行します。