2.4 AQ操作とWorkspace Managerイベント
この項では、取得したWorkspace Managerイベントを処理するアプリケーションの開発者に関連するアドバンスト・キューイング・オブジェクトと手法について説明します。
親トピック: Workspace Managerイベント
2.4.1 Workspace Managerイベントのキュー管理
Workspace Managerでは、キュー表WMSYS.WM$EVENT_QUEUE_TABLEに基づいてマルチ・コンシューマ・キューWMSYS.WM$EVENT_QUEUEが作成されます。キューのペイロード・タイプは、オブジェクト型であるWMSYS.WM$EVENT_TYPEです。
AQは、管理に使用できるキュー用に複数のビューを作成します。表2-3に、Workspace Managerアプリケーションの開発者にとって重要なビューを示します。
表2-3 AQのWorkspace Manager用管理ビュー
| ビュー名 | 説明 |
|---|---|
|
WMSYS.AQ$WM$EVENT_QUEUE_TABLE |
イベントが格納されているキュー表の記述が表示されます。このビューを使用してイベントの問合せができます。 |
|
WMSYS.AQ$WM$EVENT_QUEUE_TABLE_S |
イベント・キューのサブスクライバがすべて表示されます。また、作成時に使用された場合は、サブスクライバの変換も表示されます。 |
|
WMSYS.AQ$WM$EVENT_QUEUE_TABLE_R |
指定したキュー表にあるキューすべてのルールベース・サブスクライバと、各サブスクライバが定義したルールのテキストのみが表示されます。また、指定された場合は、サブスクライバの変換も表示されます。 |
親トピック: AQ操作とWorkspace Managerイベント
2.4.2 キューに対する権限とアクセス制御
データベース管理者は、複数の方法でキューに対する権限とアクセス権を付与できます。次のような使用例が可能です。
-
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGEプロシージャを使用して、データベース・ユーザーにシステム権限ENQUEUE ANY QUEUEおよびDEQUEUE ANY QUEUEを直接付与し、後からオプションでDBMS_AQADM.REVOKE_SYSTEM_PRIVILEGEプロシージャを使用して権限を取り消す方法。 -
DBMS_AQADM.GRANT_QUEUE_PRIVILEGEプロシージャを使用して、データベース・ユーザーにイベント・キューWMSYS.WM$EVENT_QUEUEに対するキュー権限ENQUEUEおよびDEQUEUEを付与し、後からオプションでDBMS_AQADM.REVOKE_QUEUE_PRIVILEGEプロシージャを使用して権限を取り消す方法。 -
データベース・ユーザーに
AQ_ADMINISTRATOR_ROLEロールを付与し、そのユーザーにすべてのキューの管理権限を付与する方法。
例2-2に、イベント・キューにサブスクライブしてイベントをデキューするためにユーザーに付与される権限を示します。
例2-2 キューへのアクセス権限の付与
-- Do the following while connected as SYSDBA.
-- These privileges are required for the user to execute AQ packages.
grant execute on DBMS_AQ to SCOTT ;
grant execute on DBMS_AQADM to SCOTT ;
-- Grant privilege to SCOTT for subscribing to the event queue.
exec DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE('MANAGE_ANY','SCOTT') ;
-- Grant privilege to SCOTT to dequeue events. (As an alternative, you could use
-- DBMS_AQADM.GRANT_QUEUE_PRIVILEGE to grant the DEQUEUE privilege on
-- WMSYS.WM$EVENT_QUEUE.)
exec DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE('DEQUEUE_ANY','SCOTT') ;親トピック: AQ操作とWorkspace Managerイベント
2.4.3 ルールベースのサブスクリプション
イベントは、イベント・パラメータに基づいて複数の受信者に配信できます。受信対象イベントを指定するためのメカニズムとして、イベント・キューに関するルールベースのサブスクリプションを定義できます。これにより、サブスクライバ・ルールを使用して、イベント配信のために受信者が評価されます。NULLのルールは、サブスクライバが全イベントの受信を必要としていることを示します。
例2-3では、親作業領域がLIVE作業領域の場合に、ユーザーSCOTTがWORKSPACE_MERGE_WO_REMOVEイベントを配信するためのルールベース・サブスクリプションを作成しています。
例2-3 Workspace Managerイベントに関するルールベースのサブスクリプション
rem =================================================
rem Create queue subscribers
rem Register for MergeWorkspace event when
rem a workspace is merged to LIVE
rem =================================================
connect scott
-- Enter password when prompted.
DECLARE
subscriber sys.aq$_agent;
BEGIN
subscriber := sys.aq$_agent('MERGE_LISTENER', NULL, NULL);
dbms_aqadm.add_subscriber(
queue_name => 'WMSYS.WM$EVENT_QUEUE',
subscriber => subscriber,
rule => 'tab.user_data.event_name = ''WORKSPACE_MERGE_WO_REMOVE''
and tab.user_data.parent_workspace_name = ''LIVE''');
END;
/親トピック: AQ操作とWorkspace Managerイベント
2.4.4 イベントのリスニング
リスニング・コールは、キューまたはサブスクリプション・リストにあるイベントの待機に使用できるブロック化コールです。リスニングが正常に戻った場合は、デキューを使用してイベントを取り出す必要があります。
例2-4では、イベント・キューでイベントをリスニングしています。
例2-4 Workspace Managerイベントのリスニング
rem ==============================================================
rem The following example shows how an application can listen for
rem an event. Explicit dequeue must be performed to get the actual
rem event parameters. The user SCOTT must have sufficient privileges
rem as described in the "Access Control" section.
rem ==============================================================
connect scott
-- Enter password when prompted.
set serveroutput on
DECLARE
qlist dbms_aq.aq$_agent_list_t;
agent_w_msg sys.aq$_agent;
listen_timeout exception;
pragma exception_init(listen_timeout, -25254);
BEGIN
qlist(0) := sys.aq$_agent('MERGE_LISTENER', 'WMSYS.WM$EVENT_QUEUE', NULL);
dbms_output.put_line ('Listening on event queue.');
BEGIN
DBMS_AQ.LISTEN(
agent_list => qlist,
wait => 30,
agent => agent_w_msg);
dbms_output.put_line(agent_w_msg.name) ;
/* The event can be dequeued here to get the event data */
EXCEPTION
when listen_timeout THEN
null;
END;
END;
/親トピック: AQ操作とWorkspace Managerイベント
2.4.5 非同期通知
非同期通知を使用すると、クライアントは必要なイベントの通知を受信できます。この通知を使用して、複数のサブスクリプションを監視できます。クライアントは、データベースに接続しなくても、サブスクリプションに関する通知を受信できます。
アプリケーションがコールバックを使用してWorkspace Managerイベントの非同期通知に登録する場合は、次のようにinit.oraパラメータの最小値を設定する必要があります。
-
aq_tm_processes= 1 -
job_queue_processes= 2
例2-5では、イベントの非同期通知を受信するためにコールバックに登録しています。
例2-5 イベントの非同期通知の受信
rem =====================================================
rem Example of how to register for a callback to the event
rem queue on behalf of a subscriber. Subscriber has already
rem been defined in previous section. The callback is
rem invoked by the AQ framework whenever an event satisfying the
rem rule for the subscriber occurs. The minimum values for
rem the following init.ora parameters should be set as follows.
rem aq_tm_processes = 1
rem job_queue_processes = 2
rem The user SCOTT must have sufficient privileges.
rem ===========================================================
CONNECT scott
-- Enter password when prompted.
CREATE TABLE merge_log
(
event_name varchar2(128),
workspace_name varchar2(128),
parent_workspace_name varchar2(128),
user_name varchar2(128)
);
CREATE OR REPLACE PROCEDURE scott.event_callback(
context RAW , reginfo sys.aq$_reg_info, descr sys.aq$_descriptor,
payload VARCHAR2, payloadl NUMBER)
AS
deq_msgid RAW(16);
dopt dbms_aq.dequeue_options_t;
mprop dbms_aq.message_properties_t;
event WMSYS.WM$EVENT_TYPE;
no_messages exception;
pragma exception_init(no_messages, -25228);
BEGIN
dopt.consumer_name := 'MERGE_LISTENER';
dopt.wait := 30;
dopt.msgid := descr.msg_id;
dbms_aq.dequeue(
queue_name => 'WMSYS.WM$EVENT_QUEUE',
dequeue_options => dopt,
message_properties => mprop,
payload => event,
msgid => deq_msgid);
INSERT INTO merge_log VALUES (event.event_name, event.workspace_name,
event.parent_workspace_name, event.user_name);
/* Note: If there are additional parameters stored in
"aux_params" attribute, it can be accessed using
event.aux_params(1).name, event.aux_params(1).value,
event.aux_params(2).name … and so on. The number of
parameters can be accessed using event.aux_params.count
when aux_params is not null.
*/
END;
/
grant execute on scott.event_callback to public ;
rem ==================================================
rem Register a callback for the event
rem Queue name and subscriber name have to be specified
rem while registering for a callback
rem ==================================================
DECLARE
reginfo1 sys.aq$_reg_info;
reginfolist sys.aq$_reg_info_list;
BEGIN
reginfo1 := sys.aq$_reg_info('WMSYS.WM$EVENT_QUEUE:MERGE_LISTENER',1,'plsql://scott.event_callback?PR=1',HEXTORAW('FF'));
reginfolist := sys.aq$_reg_info_list(reginfo1);
sys.dbms_aq.register(reginfolist, 1);
COMMIT;
END;
/親トピック: AQ操作とWorkspace Managerイベント