8 Oracle Database Advanced Queuing管理インタフェース
次のトピックでは、Oracle Database Advanced Queuing (AQ)の管理インタフェースについて説明します。
関連項目:
-
各プログラム・インタフェースで使用可能な機能のリストは、「Oracle Database Advanced Queuing: プログラム・インタフェース」を参照してください。
-
DBMS_AQADMパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
8.1 非シャード・キュー表の管理
8.1.1 キュー表の作成
DBMS_AQADM.CREATE_QUEUE_TABLE
は、事前定義タイプのメッセージ用の非シャード・キュー表を作成します。
DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table IN VARCHAR2, queue_payload_type IN VARCHAR2, storage_clause IN VARCHAR2 DEFAULT NULL, sort_list IN VARCHAR2 DEFAULT NULL, multiple_consumers IN BOOLEAN DEFAULT FALSE, message_grouping IN BINARY_INTEGER DEFAULT NONE, comment IN VARCHAR2 DEFAULT NULL, auto_commit IN BOOLEAN DEFAULT TRUE, primary_instance IN BINARY_INTEGER DEFAULT 0, secondary_instance IN BINARY_INTEGER DEFAULT 0, compatible IN VARCHAR2 DEFAULT NULL, secure IN BOOLEAN DEFAULT FALSE replication_mode IN BINARY_INTEGER DEFAULT NONE);
次の必須およびオプションのパラメータがあります。
パラメータ | 説明 |
---|---|
|
データベースの互換性が10.0である場合のみ、大文字と小文字が混在するキュー表の名前を指定できますが、名前を二重引用符で囲む必要があります。したがって、 12cリリース2 (12.2)以降では、AQキュー表名の最大長は122バイトです。長い名前のキュー表を作成しようとすると、エラーORA-24019が発生します。 |
|
この必須パラメータは、ペイロード型をRAWまたはオブジェクト型として指定します。詳細は、「ペイロード型」を参照してください。 |
|
このオプション・パラメータは、キュー表の表領域を指定します。詳細は、「STORAGE句」を参照してください。 |
|
このオプション・パラメータは、昇順でソート・キーとして使用される1つまたは2つの列を指定します。 |
|
このオプション・パラメータは、キュー表をシングル・コンシューマまたはマルチ・コンシューマとして指定します。デフォルトの |
|
このオプション・パラメータは、メッセージがグループ化されるかどうかを指定します。デフォルトの |
|
このオプション・パラメータは、ユーザーが指定したキュー表の説明です。このユーザー・コメントは、キュー・カタログに追加されます。 |
|
注意: このパラメータは非推奨となっています。 |
|
このオプション・パラメータは、キュー表の1次所有者を指定します。キュー・モニターのスケジューリングとキュー表内のキューの伝播は、このインスタンスで実行されます。デフォルト値の
|
|
このオプション・パラメータは、プライマリ・インスタンスが使用できない場合のキュー表の所有者を指定します。デフォルト値の
|
|
このオプション・パラメータは、そのキュー表が互換性を持つ最も低いデータベース・バージョンを指定します。可能な値は、 互換性の詳細は、「Oracle Database Advanced Queuingの互換性パラメータ」を参照してください。 |
|
キュー表を保護キューに使用する場合は、このオプション・パラメータを |
|
将来の使用のために予約されています。キューがレプリケーション・モードで作成されている場合は |
ペイロード・タイプ
ペイロード型をオブジェクト型として指定するには、オブジェクト型を定義する必要があります。
注意:
オブジェクト型のシノニムを作成している場合、それをDBMS_AQADM.CREATE_QUEUE_TABLE
で使用することはできません。エラーORA-24015が発生します。
CLOB、BLOBおよびBFILEオブジェクトはOracle Database Advanced Queuingメッセージで有効です。これらのオブジェクト型は、Oracle8iリリース8.1.x以降のOracleソフトウェアを使用してOracle Database Advanced Queuing伝播で伝播できます。 LOBのオブジェクト型をエンキューするには、まずLOB_attribute
をEMPTY_BLOB
()に設定した後に、エンキューを実行する必要があります。その後、キュー表のビューから生成されたLOB
ロケータを選択して標準のLOB
操作を使用できます。
注意:
LOBを含むペイロードの場合、エンキューおよびデキュー操作を実行するには、キュー表に対する明示的なSelect
、Insert
およびUpdate
権限を付与する必要があります。
STORAGE句
storage_clause
引数には、標準のCREATE TABLE
storage_clause
引数に使用できるテキストを入力できます。
表領域が指定されたキュー表では、索引構成表(IOT)および索引は、すべてその表領域に作成されます。現在、これらを異なる表領域間に分割することはできません。
注意:
11gリリース2 (11.2)のqmonプロセスでは、デキューIOT、履歴IOTおよびタイム・マネージャIOTの自動結合を実行します。手動でAQのIOTを結合する必要はありません。ただし、パフォーマンスの低下が見られる場合、回避策として実行することが可能です。
ローカル管理表領域にキュー表を作成するか、2つ以上の空きリスト・グループがあるキュー表を作成する場合、キュー・モニター・コーディネータはそのブロックのクリーン・アップをスキップします。これにより、時間の経過とともにパフォーマンスが低下する可能性があります。
デキューIOTを結合するには次を実行します。
ALTER TABLE AQ$_queue_table_I COALESCE;
このコマンドは、キューの同時デキュー元およびエンキュー元がある場合に実行できますが、コマンドの実行中に、同時ユーザーのパフォーマンスが若干低下する可能性があります。
ソート・キー
sort_listパラメータは、メッセージがデキューされる順序を決定します。キュー表を作成した後は、メッセージのソート順序を変更することはできません。選択肢は次のとおりです。
-
ENQ_TIME
-
ENQ_TIME,PRIORITY
-
PRIORITY
-
PRIORITY,ENQ_TIME
-
PRIORITY,COMMIT_TIME
-
COMMIT_TIME
COMMIT_TIME
を指定すると、キュー表を使用する任意のキューがコミット時間キューになり、Oracle Database Advanced Queuingは、トランザクションをコミットするときに、エンキューされたメッセージごとに近似CSCNを計算します。
COMMIT_TIME
をソート・キーとして指定する場合、次の値も指定する必要があります。
-
multiple_consumers
=TRUE
-
message_grouping
=TRANSACTIONAL
-
compatible
=8.1
以上
コミット時間順序付けは、トランザクションが相互に依存している場合、またはキュー内のメッセージを参照するときに一貫した結果が必要な場合に便利です。
その他の表およびビュー
表の作成時に、次のオブジェクトが作成されます。
-
AQ$
_queue_table_name
: Oracle Database Advanced Queuingアプリケーションでキュー・データの問合せに使用される読込み専用のビュー -
AQ$_
queue_table_name
_E
: キュー表に対応付けられたデフォルトの例外キュー -
AQ$_
queue_table_name
_I
: マルチ・コンシューマ・キューの場合にデキュー操作に使用される索引または索引構成表(IOT) -
AQ$_
queue_table_name
_T
: キュー・モニター操作の索引 -
AQ$_
queue_table_name
_L
: コミットされたデキュー操作のメッセージ識別子のキューの格納に使用されるデキュー・ログ表
次のオブジェクトは、8.1互換のマルチ・コンシューマ・キュー表でのみ作成されます。
-
AQ$_
queue_table_name
_S
: サブスクライバに関する情報の格納に使用される表 -
AQ$_
queue_table_name
_H
: デキュー履歴データの格納に使用される索引構成表(IOT)
注意:
Oracle Database Advanced Queuingでは、これらの内部AQのキュー表に対するトリガーの使用はサポートされていません。
スキーマを指定しない場合、デフォルトのスキーマはそのユーザーのスキーマになります。
GLOBAL_TOPIC_ENABLED
=
TRUE
の場合は、キュー表が作成されると、対応するLightweight Directory Access Protocol(LDAP)エントリも作成されます。
キュー・タイプがANYDATA
の場合、バッファ済キューと2つの追加オブジェクトが作成されます。バッファ済キューには、取得プロセスによって作成された論理変更レコードが格納されます。論理変更レコードがキューに関連付けられたメモリー・バッファにステージングされた場合、通常はディスクに書き込まれません。
デキューされずに一定の期間バッファ内でステージングされているか、すべての取得済イベントを保持するのに十分な空きがメモリーにない場合、論理変更レコードは次の表に流出します。
-
AQ$_
queue_table_name
_P
: メモリーから流出した取得済イベントの格納に使用される表 -
AQ$_
queue_table_name
_D
: 伝播に関する情報の格納と、各イベントの処理に適したプロセスの適用に使用される表
関連項目:
-
『Oracle Streams概要および管理』のコミット時間キューに関する項
-
『Oracle Streams概要および管理』の第3章「Oracle Streamsのステージングおよび伝播」
例
次の例では、SQL*Plusテスト環境を使用していることを前提にしています。例8-1では、この章にある他の例の準備としてユーザーを作成します。この例では、管理者権限を持つユーザーとして接続する必要があります。この章にある他の例のほとんどでは、ユーザーtest_adm
として接続できます。いくつかの例は、DBMS_AQADM
のEXECUTE
権限を使用してtest
として実行する必要があります。
例8-1 AQ管理ユーザーの設定
CREATE USER test_adm IDENTIFIED BY test_adm DEFAULT TABLESPACE example; GRANT DBA, CREATE ANY TYPE TO test_adm; GRANT EXECUTE ON DBMS_AQADM TO test_adm; GRANT aq_administrator_role TO test_adm; BEGIN DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE( privilege => 'MANAGE_ANY', grantee => 'test_adm', admin_option => FALSE); END; / CREATE USER test IDENTIFIED BY test; GRANT EXECUTE ON dbms_aq TO test;
例8-2 AQ管理のサンプル・タイプの設定
CREATE TYPE test.message_typ AS object( sender_id NUMBER, subject VARCHAR2(30), text VARCHAR2(1000)); / CREATE TYPE test.msg_table AS TABLE OF test.message_typ; / CREATE TYPE test.order_typ AS object( custno NUMBER, item VARCHAR2(30), description VARCHAR2(1000)); / CREATE TYPE test.lob_typ AS object( id NUMBER, subject VARCHAR2(100), data BLOB, trailer NUMBER); /
例8-3 オブジェクト型メッセージのキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.obj_qtab', queue_payload_type => 'test.message_typ'); END; /
例8-4 RAW型メッセージのキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.raw_qtab', queue_payload_type => 'RAW'); END; /
例8-5 LOB型メッセージのキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.lob_qtab', queue_payload_type => 'test.lob_typ'); END; /
例8-6 XMLTypeメッセージのキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.xml_qtab', queue_payload_type => 'SYS.XMLType', multiple_consumers => TRUE, compatible => '8.1', comment => 'Overseas Shipping multiconsumer orders queue table'); END; /
例8-7 グループ化メッセージのキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.group_qtab', queue_payload_type => 'test.message_typ', message_grouping => DBMS_AQADM.TRANSACTIONAL); END; /
例8-8 優先メッセージおよびマルチ・コンシューマのキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.priority_qtab', queue_payload_type => 'test.order_typ', sort_list => 'PRIORITY,ENQ_TIME', multiple_consumers => TRUE); DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.multiconsumer_qtab', queue_payload_type => 'test.message_typ', sort_list => 'PRIORITY,ENQ_TIME', multiple_consumers => TRUE); END; /
例8-9 コミット時間順序付けを使用したキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.commit_time_qtab', queue_payload_type => 'test.message_typ', sort_list => 'COMMIT_TIME', multiple_consumers => TRUE, message_grouping => DBMS_AQADM.TRANSACTIONAL, compatible => '10.0'); END; /
例8-10 マルチ・コンシューマの8.1互換キュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.multiconsumer_81_qtab', queue_payload_type => 'test.message_typ', multiple_consumers => TRUE, compatible => '8.1'); END; /
例8-11 指定した表領域に対するキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.example_qtab', queue_payload_type => 'test.message_typ', storage_clause => 'tablespace example'); END; /
例8-12 空きリストまたは空きリスト・グループがあるキュー表の作成
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( queue_table => 'test.freelist_qtab', queue_payload_type => 'RAW', storage_clause => 'STORAGE (FREELISTS 4 FREELIST GROUPS 2)', compatible => '8.1'); END; /
8.1.2 キュー表の変更
DBMS_AQADM.ALTER_QUEUE_TABLE
は、非シャード・キュー表の既存のプロパティを変更します。
DBMS_AQADM.ALTER_QUEUE_TABLE ( queue_table IN VARCHAR2, comment IN VARCHAR2 DEFAULT NULL, primary_instance IN BINARY_INTEGER DEFAULT NULL, secondary_instance IN BINARY_INTEGER DEFAULT NULL replication_mode IN BINARY_INTEGER DEFAULT NULL);
パラメータ | 説明 |
---|---|
|
この必須パラメータは、キュー表名を指定します。 |
|
このオプション・パラメータは、ユーザーが指定したキュー表の説明です。このユーザー・コメントは、キュー・カタログに追加されます。 |
|
このオプション・パラメータは、キュー表の1次所有者を指定します。キュー・モニターのスケジューリングとキュー表内のキューの伝播は、このインスタンスで実行されます。
|
|
このオプション・パラメータは、プライマリ・インスタンスが使用できない場合のキュー表の所有者を指定します。
|
|
将来の使用のために予約されています。キューがレプリケーション・モードで変更されている場合は |
注意:
一般に、キュー表ではDDL文はサポートされていないため、キュー表が操作不可能になる場合があります。たとえば、キュー表に対してALTER TABLE
...SHRINK
文を発行すると、内部エラーが発生し、その後キュー表を使用しようとしても、常にエラーになります。キュー表ではDDL文を使用しないことをお薦めします。
GLOBAL_TOPIC_ENABLED = TRUE
の場合は、キュー表が変更されると、対応するLDAPエントリも変更されます。
例8-13 プライマリおよびセカンダリ・インスタンスの変更によるキュー表の変更
BEGIN DBMS_AQADM.ALTER_QUEUE_TABLE( queue_table => 'test.obj_qtab', primary_instance => 3, secondary_instance => 2); END; /
例8-14 コメントの変更によるキュー表の変更
BEGIN DBMS_AQADM.ALTER_QUEUE_TABLE( queue_table => 'test.obj_qtab', comment => 'revised usage for queue table'); END; /
8.1.3 キュー表の削除
DBMS_AQADM.DROP_QUEUE_TABLE
は、既存の非シャード・キュー表を削除します。
DBMS_AQADM.DROP_QUEUE_TABLE( queue_table IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE,
キュー表を削除する前に、そのキュー表内のすべてのキューを停止して削除する必要があります。force
がFALSE
に設定されている場合、明示的に実行する必要があります。force
がTRUE
に設定されている場合、キュー表内のすべてのキューと関連付けられた伝播スケジュールが自動的に削除されます。
GLOBAL_TOPIC_ENABLED = TRUE
の場合は、キュー表が削除されると、対応するLDAPエントリも削除されます。
例8-15 キュー表の削除
BEGIN DBMS_AQADM.DROP_QUEUE_TABLE( queue_table => 'test.obj_qtab'); END; /
例8-16 forceオプションを使用したキューの削除
BEGIN DBMS_AQADM.DROP_QUEUE_TABLE( queue_table => 'test.raw_qtab', force => TRUE); END; /
8.1.4 キュー表のパージ
DBMS_AQADM.PURGE_QUEUE_TABLE
は、非シャード・キュー表からメッセージをパージします。
DBMS_AQADM.PURGE_QUEUE_TABLE( queue_table IN VARCHAR2, purge_condition IN VARCHAR2, purge_options IN aq$_purge_options_t);
次のパラメータがあります。
このプロシージャを実行すると、トレース・ファイルがudumpの宛先に生成されます。プロシージャの実行内容の詳細が示されます。このプロシージャはすべてのメッセージの処理後にコミットされます。
関連項目:
DBMS_AQADM.PURGE_QUEUE_TABLE
の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_AQADMに関する項を参照してください。
例8-17 キュー表のすべてのメッセージのパージ
DECLARE po dbms_aqadm.aq$_purge_options_t; BEGIN po.block := FALSE; DBMS_AQADM.PURGE_QUEUE_TABLE( queue_table => 'test.obj_qtab', purge_condition => NULL, purge_options => po); END; /
例8-18 指定したキューのすべてのメッセージのパージ
DECLARE po dbms_aqadm.aq$_purge_options_t; BEGIN po.block := TRUE; DBMS_AQADM.PURGE_QUEUE_TABLE( queue_table => 'test.obj_qtab', purge_condition => 'qtview.queue = ''TEST.OBJ_QUEUE''', purge_options => po); END; /
例8-19 指定したキューのすべてのPROCESSEDメッセージのパージ
DECLARE po dbms_aqadm.aq$_purge_options_t; BEGIN po.block := TRUE; DBMS_AQADM.PURGE_QUEUE_TABLE( queue_table => 'test.obj_qtab', purge_condition => 'qtview.queue = ''TEST.OBJ_QUEUE'' and qtview.msg_state = ''PROCESSED''', purge_options => po); END; /
例8-20 指定したキューと指定したコンシューマのすべてのメッセージのパージ
DECLARE po dbms_aqadm.aq$_purge_options_t; BEGIN po.block := TRUE; DBMS_AQADM.PURGE_QUEUE_TABLE( queue_table => 'test.multiconsumer_81_qtab', purge_condition => 'qtview.queue = ''TEST.MULTICONSUMER_81_QUEUE'' and qtview.consumer_name = ''PAYROLL_APP''', purge_options => po); END; /
例8-21 指定した送信者からのすべてのメッセージの削除
DECLARE po dbms_aqadm.aq$_purge_options_t; BEGIN po.block := TRUE; DBMS_AQADM.PURGE_QUEUE_TABLE( queue_table => 'test.multiconsumer_81_qtab', purge_condition => 'qtview.sender_name = ''TEST.OBJ_QUEUE''', purge_options => po); END; /
8.1.5 キュー表の移行
DBMS_AQADM.MIGRATE_QUEUE_TABLE
は、非シャード・キュー表を8.0、8.1または10.0から8.0、8.1または10.0に移行します。移行を実行できるのは、キュー表の所有者のみです。
DBMS_AQADM.MIGRATE_QUEUE_TABLE( queue_table IN VARCHAR2, compatible IN VARCHAR2);
注意:
このプロシージャでは、キュー表の所有者(通常のキュー・ユーザー)にDBMS_AQADM
のEXECUTE
権限を付与する必要があります。通常のキュー・ユーザーに対してキューおよびキュー表の作成と削除、サブスクライバの追加と削除などを許可しない場合は、移行完了の直後にEXECUTE
権限を取り消す必要があります。
注意:
compatible
が8.0
に設定されているキュー表で作成されたキュー(このマニュアルでは8.0形式のキューと呼びます)は、Oracle Database Advanced Queuing 10gリリース2 (10.2)では非推奨になっています。したがって、新しいキューの作成には8.1以降の形式を使用し、既存の8.0形式のキューをなるべく早く移行することをお薦めします。
スキーマが下位リリースからエクスポートされたダンプのインポートによって作成された場合、またはスキーマに下位リリースからアップグレードされたOracle Database Advanced Queuingキューがある場合は、DROP USER CASCADE
を使用してスキーマを削除しようとすると、ORA-24005エラーが発生します。このようなスキーマを削除するには、次の手順に従います。
- イベント10851をレベル1に設定します。
AQ$_
queue_table_name
_NR
という形式のすべての表をスキーマから削除します。- イベント10851をオフにします。
- スキーマを削除します。
例8-22 8.1互換から10.0互換へのキュー表のアップグレード
BEGIN DBMS_AQADM.MIGRATE_QUEUE_TABLE ( queue_table => 'test.xml_qtab', compatible => '10.0'); END; /
8.2 非シャード・キューの管理
次のトピックでは、非シャード・キューを管理する方法について説明します。
注意:
シャード・キューの開始および停止では、非シャード・キューと同じAPIを使用します。
8.2.1 キューの作成
DBMS_AQADM.CREATE_QUEUE
は非シャード・キューを作成します。
DBMS_AQADM.CREATE_QUEUE( queue_name IN VARCHAR2, queue_table IN VARCHAR2, queue_type IN BINARY_INTEGER DEFAULT NORMAL_QUEUE, max_retries IN NUMBER DEFAULT NULL, retry_delay IN NUMBER DEFAULT 0, retention_time IN NUMBER DEFAULT 0, dependency_tracking IN BOOLEAN DEFAULT FALSE, comment IN VARCHAR2 DEFAULT NULL,
次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
データベースの互換性が10.0である場合のみ、大文字と小文字が混在するキュー名を指定できますが、名前を二重引用符で囲む必要があります。したがって、 12cリリース2 (12.2)以降では、ユーザーが生成するキュー名の最大長は122バイトです。長い名前のキューを作成しようとすると、エラーORA-24019が発生します。「その他の表およびキュー」にリストされているキュー名など、Oracle Database Advanced Queuingで生成されたキュー名は、128文字より長くできません。 |
|
|
|
このパラメータは、作成されるキューのタイプを指定します。デフォルトの |
|
このパラメータは、メッセージに対する |
|
このパラメータは、アプリケーションのロールバック後、スケジュールされたメッセージの再処理が行われるまでの時間を秒単位で指定します。デフォルトは0(ゼロ)で、メッセージを最も迅速に取り出せます。このパラメータは、 このパラメータは、シングル・コンシューマ・キューおよび8.1形式以上のマルチ・コンシューマ・キューではサポートされていますが、8.0形式のマルチ・コンシューマ・キュー(Oracle Database Advanced Queuing 10gリリース2 (10.2)では非推奨)ではサポートされていません。 |
|
このパラメータは、キューからデキューされた後、メッセージがキュー表内に保持される秒数を指定します。 |
|
このパラメータは、将来の使用に備えて確保されています。 |
|
このオプション・パラメータは、ユーザーが指定したキューの説明です。このユーザー・コメントは、キュー・カタログに追加されます。 |
すべてのキュー名は、スキーマ内において一意である必要があります。キューは、CREATE_QUEUE
で作成した後、START_QUEUE
をコールすると有効になります。デフォルトでは、キューはエンキューおよびデキューともに使用禁止で作成されます。保存されているメッセージを参照するには、メッセージIDによってデキューするか、またはSQLを使用します。GLOBAL_TOPIC_ENABLED = TRUE
の場合は、キューが作成されると、対応するLDAPエントリも作成されます。
例8-23 オブジェクト型メッセージのキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.obj_queue', queue_table => 'test.obj_qtab'); END; /
例8-24 RAW型メッセージのキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.raw_queue', queue_table => 'test.raw_qtab'); END; /
例8-25 LOB型メッセージのキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.lob_queue', queue_table => 'test.lob_qtab'); END; /
例8-26 グループ化メッセージのキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.group_queue', queue_table => 'test.group_qtab'); END; /
例8-27 優先メッセージのキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.priority_queue', queue_table => 'test.priority_qtab'); END; /
例8-28 優先メッセージおよびマルチ・コンシューマのキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.multiconsumer_queue', queue_table => 'test.multiconsumer_qtab'); END; /
例8-29 伝播のデモ用のキューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.another_queue', queue_table => 'test.multiconsumer_qtab'); END; /
例8-30 マルチ・コンシューマの8.1形式キューの作成
BEGIN DBMS_AQADM.CREATE_QUEUE( queue_name => 'test.multiconsumer_81_queue', queue_table => 'test.multiconsumer_81_qtab'); END; /
8.2.2 キューの変更
DBMS_AQADM.ALTER_QUEUE
は、非シャード・キューの既存のプロパティを変更します。
DBMS_AQADM.ALTER_QUEUE( queue_name IN VARCHAR2, max_retries IN NUMBER DEFAULT NULL, retry_delay IN NUMBER DEFAULT NULL, retention_time IN NUMBER DEFAULT NULL, comment IN VARCHAR2 DEFAULT NULL);
max_retries
、comment
、retry_delay
およびretention_time
のみ変更できます。保存されているメッセージを参照するには、メッセージIDによってデキューするか、またはSQLを使用します。GLOBAL_TOPIC_ENABLED = TRUE
の場合は、キューが変更されると、対応するLDAPエントリも変更されます。
次の例は、保存時間を変更して、デキュー後1日間メッセージを保存します。
例8-31 保存時間の変更によるキューの変更
BEGIN DBMS_AQADM.ALTER_QUEUE( queue_name => 'test.another_queue', retention_time => 86400); END; /
8.2.3 キューの開始
DBMS_AQADM.START_QUEUE
は、指定した非シャード・キューでのエンキューまたはデキューを有効にします。
DBMS_AQADM.START_QUEUE( queue_name IN VARCHAR2, enqueue IN BOOLEAN DEFAULT TRUE, dequeue IN BOOLEAN DEFAULT TRUE);
管理者は、キューを作成した後、START_QUEUE
を使用してそのキューを有効にする必要があります。デフォルトでは、エンキューおよびデキューの両方が有効になります。例外キューでは、デキュー操作のみ許可されます。この操作は、コールが完了し、コールにトランザクションの特性がない場合にのみ有効になります。
例8-32 エンキューおよびデキューの両方を有効にしたキューの開始
BEGIN DBMS_AQADM.START_QUEUE ( queue_name => 'test.obj_queue'); END; /
例8-33 デキューのみのキューの開始
BEGIN DBMS_AQADM.START_QUEUE( queue_name => 'test.raw_queue', dequeue => TRUE, enqueue => FALSE); END; /
8.2.4 キューの停止
DBMS_AQADM.STOP_QUEUE
は、指定した非シャード・キューでのエンキュー、デキューまたはその両方を無効にします。
DBMS_AQADM.STOP_QUEUE( queue_name IN VARCHAR2, enqueue IN BOOLEAN DEFAULT TRUE, dequeue IN BOOLEAN DEFAULT TRUE, wait IN BOOLEAN DEFAULT TRUE);
デフォルトでは、このコールによってエンキューおよびデキューの両方が無効になります。キューに対する未処理のトランザクションがある場合、キューは停止できません。この操作はコールが完了すると有効になり、トランザクションの特性はありません。
例8-34 キューの停止
BEGIN DBMS_AQADM.STOP_QUEUE( queue_name => 'test.obj_queue'); END; /
8.2.5 キューの削除
このプロシージャは、既存の非シャード・キューを削除します。あらかじめSTOP_QUEUE
がコールされ、キューがエンキューおよびデキューの両方に対して無効にされていないかぎり、DROP_QUEUE
は許可されません。すべてのキュー・データが、削除操作の一部として削除されます。
DBMS_AQADM.DROP_QUEUE( queue_name IN VARCHAR2,
GLOBAL_TOPIC_ENABLED = TRUE
の場合は、キューが削除されると、対応するLDAPエントリも削除されます。
例8-35 標準キューの削除
BEGIN DBMS_AQADM.DROP_QUEUE( queue_name => 'test.obj_queue'); END; /
8.3 シャード・キューの管理
次のトピックでは、シャード・キューを管理する方法について説明します。
注意:
シャード・キューの開始および停止では、非シャード・キューと同じAPIを使用します。
8.3.1 シャード・キューの作成
CREATE_SHARDED_QUEUE
APIはシャード・キューを作成します。
PROCEDURE CREATE_SHARDED_QUEUE ( queue_name IN VARCHAR2, storage_clause IN VARCHAR2 DEFAULT NULL, multiple_consumers IN BOOLEAN DEFAULT FALSE, max_retries IN NUMBER DEFAULT NULL, comment IN VARCHAR2 DEFAULT NULL, queue_payload_type IN VARCHAR2 DEFAULT JMS_TYPE, queue_properties IN QUEUE_PROPS_T DEFAULT NULL, replication_mode IN BINARY_INTEGER DEFAULT NONE);
次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
この必須パラメータは、新しいキューの名前を指定します。最大で128文字まで使用できます。 |
|
記憶域パラメータは、キュー表の作成時に、 ここで表領域が指定されない場合は、キュー表とそのすべての関連オブジェクトが、デフォルトのユーザー表領域に作成されます。ここで表領域が指定されると、キュー表とそのすべての関連オブジェクトが、STORAGE句で指定された表領域に作成されます。これらのパラメータの使用方法は、『Oracle Database SQL言語リファレンス』を参照してください。 |
|
|
|
このオプション・パラメータは、メッセージのデキューに失敗した後に再試行できる回数を制限します。 |
|
このオプション・パラメータは、ユーザーが指定したキュー表の説明です。このユーザー・コメントは、キュー・カタログに追加されます。 |
|
ペイロードは、 |
|
通常キューまたは例外キュー、再試行の遅延、保持時間、ソート・リスト、キャッシュ・ヒントなどのプロパティ。
|
|
将来の使用のために予約されています。キューがレプリケーション・モードで作成されている場合は |
8.3.2 シャード・キューの削除
このプロシージャは、データベース・キューイング・システムから既存の共有されているキューを削除します。DROP_SHARDED_QUEUE
をコールする前に、キューを停止する必要があります。forceをFALSE
に設定した場合、ユーザーはDROP_SHARDED_QUEUE
をコールする前にキューを明示的に停止する必要があります。forceをTRUE
に設定した場合、キューは内部的に停止されてから削除されます。
構文
DBMS_AQADM.DROP_SHARDED_QUEUE( queue_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE )
パラメータ
表8-1 CREATE_SHARDED_QUEUEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
この必須パラメータは、共有されているキューの名前を指定します。 |
|
キューが停止されていない場合でも、共有されているキューは削除されます。 |
8.3.3 シャード・キューの変更
このプロシージャを使用すると、ユーザーはシャード・キューのqueue_properties
を変更できます。
構文
PROCEDURE ALTER_SHARDED_QUEUE( queue_name IN VARCHAR2, max_retries IN NUMBER DEFAULT NULL, comment IN VARCHAR2 DEFAULT NULL, queue_properties IN QUEUE_PROPS_T DEFAULT NULL, replication_mode IN BINARY_INTEGER DEFAULT NULL);
パラメータ
表8-2 ALTER_SHARDED_QUEUEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
このパラメータは、シャード・キューの名前を指定します。最大で128文字まで使用できます。 |
|
許可される最大試行数。 |
|
パラメータのコメント。 |
|
通常キューまたは例外キュー、再試行の遅延、保持時間、ソート・リスト、キャッシュ・ヒントなどのプロパティ。
|
|
将来の使用のために予約されています。キューがレプリケーション・モードで変更されている場合は |
8.3.4 キューのパラメータの設定
このプロシージャを使用すると、ユーザーはキュー・レベルまたはデータベース・レベルでシャード・キューに各種のパラメータを設定できます。データベース・レベルの場合、queue_name
はNULL
である必要があります。キューによってデータベース・レベルのパラメータ値が上書きされます。
構文
PROCEDURE SET_QUEUE_PARAMETER( queue_name IN VARCHAR2, param_name IN VARCHAR2, param_value IN NUMBER);
パラメータ
表8-3 SET_QUEUE_PARAMETERプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
シャード・キューの名前。 |
|
パラメータ名。 |
|
パラメータの値。 |
8.3.5 キューのパラメータの設定解除
このプロシージャを使用すると、ユーザーはキュー・レベルまたはデータベース・レベルでシャード・キューの各種のパラメータを設定解除できます。データベース・レベルの場合、queue_name
はNULL
である必要があります。キューによってデータベース・レベルのパラメータ値が上書きされます。
構文
PROCEDURE UNSET_QUEUE_PARAMETER( queue_name IN VARCHAR2, param_name IN VARCHAR2);
パラメータ
表8-4 UNSET_QUEUE_PARAMETERプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
シャード・キューの名前。 |
|
パラメータ名。 |
8.3.6 キューのパラメータの取得
このプロシージャを使用すると、ユーザーはキュー・レベルまたはデータベース・レベルでシャード・キューの各種のパラメータを取得できます。データベース・レベルの場合、queue_name
はNULL
である必要があります。キューによってデータベース・レベルのパラメータ値が上書きされます。
構文
PROCEDURE GET_QUEUE_PARAMETER( queue_name IN VARCHAR2, param_name IN VARCHAR2, param_value OUT NUMBER);
パラメータ
表8-5 GET_QUEUE_PARAMETERプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
シャード・キューの名前。 |
|
パラメータ名。 |
|
パラメータの値。 |
8.4 変換の管理
変換はメッセージのフォーマットを変更するため、あるアプリケーションによって作成されたメッセージを、別のアプリケーションで認識できます。永続メッセージとバッファ済メッセージの両方で変換を使用できます。次のトピックでは、キュー表を管理する方法について説明します。
注意:
シャード・キューは変換をサポートしていません。
8.4.1 変換の作成
DBMS_TRANSFORM.CREATE_TRANSFORMATION
は、メッセージ・フォーマットの変換を作成します。
DBMS_TRANSFORM.CREATE_TRANSFORMATION( schema VARCHAR2(30), name VARCHAR2(30), from_schema VARCHAR2(30), from_type VARCHAR2(30), to_schema VARCHAR2(30), to_type VARCHAR2(30), transformation VARCHAR2(4000));
変換は、入力の型がfrom_type
で、to_type
型のオブジェクトを返すSQLファンクションである必要があります。また、to_type
型でfrom_type
を参照するSQL式も使用できます。from_type
に対するすべての参照は、source.user_data
という形式である必要があります。
この機能を使用するには、dbms_transform
に対するEXECUTE
権限が必要です。この権限は、AQ_ADMINISTRATOR_ROLE
に含まれています。
また、変換のソース・タイプおよび宛先タイプであるユーザー定義型に対するEXECUTE
権限、および変換ファンクションで使用するすべてのPL/SQLファンクションに対するEXECUTE
権限も必要です。変換では、データベースの状態の書込み(DML操作の実行)、カレント・トランザクションのコミットまたはロールバックはできません。
例8-36 変換の作成
BEGIN DBMS_TRANSFORM.CREATE_TRANSFORMATION( schema => 'test', name => 'message_order_transform', from_schema => 'test', from_type => 'message_typ', to_schema => 'test', to_type => 'order_typ', transformation => 'test.order_typ( source.user_data.sender_id, source.user_data.subject, source.user_data.text)'); END; /
関連項目:
管理者およびユーザー・ロールの詳細は、「Oracle Database Advanced Queuingのセキュリティ」を参照してください。
8.4.2 変換の変更
DBMS_TRANSFORM.MODIFY_TRANSFORMATION
は、変換ファンクションを変更して、ターゲット型の各属性ごとに変換を指定します。
DBMS_TRANSFORM.MODIFY_TRANSFORMATION( schema VARCHAR2(30), name VARCHAR2(30), attribute_number INTEGER, transformation VARCHAR2(4000));
属性の番号が0(ゼロ)に指定された場合、変換式は単純にソース・タイプからターゲット型への変換を定義します。
from_type
に対するすべての参照は、source.user_data
という形式である必要があります。ソース・タイプの属性に対するすべての参照には、source.user_data
という接頭辞が付きます。
この機能を使用するには、dbms_transform
に対するEXECUTE
権限が必要です。また、変換のソース・タイプおよび宛先タイプであるユーザー定義型に対するEXECUTE
権限、および変換ファンクションで使用するすべてのPL/SQLファンクションに対するEXECUTE
権限も必要です。
8.5 権限の付与および取消し
次のトピックでは、権限を付与および取消しする方法について説明します。
8.5.1 Oracle Database Advanced Queuingシステム権限の付与
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE
は、ユーザーおよびロールにOracle Database Advanced Queuingシステム権限を付与します。権限は、ENQUEUE_ANY
、DEQUEUE_ANY
およびMANAGE_ANY
です。最初は、SYS
およびSYSTEM
のみがこのプロシージャを正常に使用できます。
DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE( privilege IN VARCHAR2, grantee IN VARCHAR2, admin_option IN BOOLEAN := FALSE);
ENQUEUE_ANY
権限を付与されたユーザーは、データベース内の任意のキューにメッセージをエンキューできます。DEQUEUE_ANY
権限を付与されたユーザーは、データベース内の任意のキューからメッセージをデキューできます。MANAGE_ANY
権限を付与されたユーザーは、データベースのすべてのスキーマに対してDBMS_AQADM
コールを実行できます。
例8-37 AQシステム権限の付与
BEGIN DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE( privilege => 'ENQUEUE_ANY', grantee => 'test', admin_option => FALSE); DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE( privilege => 'DEQUEUE_ANY', grantee => 'test', admin_option => FALSE); END; /
8.5.2 Oracle Database Advanced Queuingシステム権限の取消し
DBMS_AQADM.REVOKE_SYSTEM_PRIVILEGE
は、ユーザーおよびロールからOracle Database Advanced Queuingシステム権限を取り消します。権限は、ENQUEUE_ANY
、DEQUEUE_ANY
およびMANAGE_ANY
です。
DBMS_AQADM.REVOKE_SYSTEM_PRIVILEGE( privilege IN VARCHAR2, grantee IN VARCHAR2);
システム権限のADMIN
オプションを選択的に取り消すことはできません。
ENQUEUE_ANY
権限を付与されたユーザーは、データベース内の任意のキューにメッセージをエンキューできます。DEQUEUE_ANY
権限を付与されたユーザーは、データベース内の任意のキューからメッセージをデキューできます。MANAGE_ANY
権限を付与されたユーザーは、データベースのすべてのスキーマに対してDBMS_AQADM
コールを実行できます。
例8-38 AQシステム権限の取消し
BEGIN DBMS_AQADM.REVOKE_SYSTEM_PRIVILEGE( privilege => 'DEQUEUE_ANY', grantee => 'test'); END; /
8.5.3 キュー権限の付与
DBMS_AQADM.GRANT_QUEUE_PRIVILEGE
は、ユーザーおよびロールにキューの権限を付与します。権限は、ENQUEUE
、DEQUEUE
またはALL
です。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのキューの権限を付与できます。
DBMS_AQADM.GRANT_QUEUE_PRIVILEGE( privilege IN VARCHAR2, queue_name IN VARCHAR2, grantee IN VARCHAR2, grant_option IN BOOLEAN := FALSE);
注意:
このプロシージャでは、キュー表の所有者(通常のキュー・ユーザー)にDBMS_AQADM
のEXECUTE
権限を付与する必要があります。通常のキュー・ユーザーに対してキューおよびキュー表の作成と削除、サブスクライバの追加と削除などを許可しない場合は、初期のGRANT_QUEUE_PRIVILEGE
の完了直後にEXECUTE
権限を取り消す必要があります。
例8-39 キュー権限の付与
BEGIN DBMS_AQADM.GRANT_QUEUE_PRIVILEGE ( privilege => 'ALL', queue_name => 'test.multiconsumer_81_queue', grantee => 'test_adm', grant_option => TRUE); END; /
8.5.4 キュー権限の取消し
DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE
は、ユーザーおよびロールからキューの権限を取り消します。この権限とは、ENQUEUE
またはDEQUEUE
です。
DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE ( privilege IN VARCHAR2, queue_name IN VARCHAR2, grantee IN VARCHAR2);
権限を取り消すには、取消し実行者がその権限の付与者である必要があります。GRANT
オプションによって伝播された権限は、付与者の権限が取り消されたときに取り消されます。
例8-40に示すように、権限受領者から特定のキューに関するデキュー権限を取り消して、エンキュー権限のみを付与しておくこともできます。
例8-40 デキュー権限の取消し
BEGIN DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE( privilege => 'DEQUEUE', queue_name => 'test.multiconsumer_81_queue', grantee => 'test_adm'); END;
8.6 サブスクライバの管理
次のトピックでは、サブスクライバを管理する方法について説明します。
8.6.1 サブスクライバの追加
DBMS_AQADM.ADD_SUBSCRIBER
は、キューにデフォルトのサブスクライバを追加します。
DBMS_AQADM.ADD_SUBSCRIBER ( queue_name IN VARCHAR2, subscriber IN sys.aq$_agent, rule IN VARCHAR2 DEFAULT NULL, transformation IN VARCHAR2 DEFAULT NULL, queue_to_queue IN BOOLEAN DEFAULT FALSE, delivery_mode IN PLS_INTEGER DEFAULT PERSISTENT);
アプリケーションは、特定の受信者リストまたはデフォルトのサブスクライバ・リストに対してメッセージをエンキューできます。この操作は、マルチ・コンシューマが許可されているキューでのみ成功し、サブスクライバの合計は1024以下である必要があります。この操作はすぐに有効になり、この操作を含むトランザクションはコミットされます。このコール後に実行されたエンキュー要求は、新しいアクションを反映します。rule
内のすべての文字列は、次のように、一重引用符で囲まれている必要があります。
rule => 'PRIORITY <= 3 AND CORRID = ''FROM JAPAN'''
ユーザー・データ・プロパティまたは属性は、オブジェクト・ペイロードのみに適用され、常に接頭辞としてtab.userdata
を付ける必要があります。
GLOBAL_TOPIC_ENABLED
がTRUEの場合は、サブスクライバが作成されると、対応するLDAPエントリも作成されます。
デキューまたは伝播中に適用する変換の名前を指定します。変換は、DBMS_TRANSFORM
パッケージを使用して作成します。
XMLType属性を持つペイロードを含むキューに対しては、XMLType.existsNode()
メソッドおよびXMLType.extract()
メソッドを含むルールを指定できます。
パラメータqueue_to_queue
がTRUE
に設定されている場合、追加されたサブスクライバは、キューからキューへのサブスクライバです。ソース・キューと宛先キューの間にキューからキューへの伝播が設定されている場合、キューからキューへのサブスクライバは、その伝播スケジュールによってメッセージを受信します。
delivery_mode
パラメータがデフォルトのPERSISTENT
の場合、サブスクライバは永続メッセージのみを受信します。BUFFERED
に設定されている場合、サブスクライバはバッファ済メッセージのみを受信します。PERSISTENT_OR_BUFFERED
に設定されている場合、サブスクライバは両方のタイプを受信します。ALTER_SUBSCRIBER
を使用してこのパラメータを変更することはできません。
宛先キューがシングル・コンシューマ・キューの場合、エージェント名は、NULL
である必要があります。
注意:
ADD_SUBSCRIBER
はキューに対する管理操作です。Oracle Database AQでは、アプリケーションによる管理コールおよび操作コールの同時発行が可能ですが、実行は逐次行われます。ADD_SUBSCRIBER
は、メッセージをエンキューまたはデキューしている保留中のコールが完了するまでブロックします。保留中のトランザクションの完了は待機しません。
関連項目:
-
DBMS_TRANSFORM
パッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
例8-41 データベース・リンクの指定されたキューでのサブスクライバの追加
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent('subscriber1', 'test2.msg_queue2@london', null); DBMS_AQADM.ADD_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber); END; /
例8-42 データベース・リンクへのサブスクライバとしてのシングル・コンシューマ・キューの追加
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent('subscriber1', 'test2.msg_queue2@london', null); DBMS_AQADM.ADD_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber); END; /
例8-43 ルールを使用したサブスクライバの追加
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent('subscriber2', 'test2.msg_queue2@london', null); DBMS_AQADM.ADD_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber, rule => 'priority < 2'); END; /
例8-44 サブスクライバの追加と変換の指定
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent('subscriber3', 'test2.msg_queue2@london', null); DBMS_AQADM.ADD_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber, transformation => 'test.message_order_transform'); END; /
例8-45 マルチ・コンシューマ・キューからシングル・コンシューマ・キューへの伝播
DECLARE subscriber SYS.AQ$_AGENT; BEGIN subscriber := SYS.AQ$_AGENT(NULL, 'test2.single_consumer__queue@london', null); DBMS_AQADM.ADD_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber); END;
8.6.2 サブスクライバの変更
DBMS_AQADM.ALTER_SUBSCRIBER
は、指定したキューに対するサブスクライバの既存プロパティを変更します。
DBMS_AQADM.ALTER_SUBSCRIBER ( queue_name IN VARCHAR2, subscriber IN sys.aq$_agent, rule IN VARCHAR2 transformation IN VARCHAR2);
ルールまたは変換(あるいはその両方)を変更できます。これらの属性のいずれか1つのみを変更する場合は、他の属性の既存の値を変更コールに指定します。GLOBAL_TOPIC_ENABLED = TRUEの場合は、サブスクライバが変更されると、対応するLDAPエントリが作成されます。
例8-46 サブスクライバ・ルールの変更
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent('subscriber2', 'test2.msg_queue2@london', null); DBMS_AQADM.ALTER_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber, rule => 'priority = 1'); END; /
8.6.3 サブスクライバの削除
DBMS_AQADM.REMOVE_SUBSCRIBER
は、デフォルトのサブスクライバをキューから削除します。
DBMS_AQADM.REMOVE_SUBSCRIBER ( queue_name IN VARCHAR2, subscriber IN sys.aq$_agent);
この操作はすぐに有効になり、この操作を含むトランザクションはコミットされます。既存メッセージ内のこのサブスクライバに対するすべての参照は、操作の一部として削除されます。GLOBAL_TOPIC_ENABLED = TRUE
の場合は、サブスクライバが削除されると、対応するLDAPエントリも削除されます。
そのコンシューマがデキューできるが保留しているメッセージがあるときに、REMOVE_SUBSCRIBER
プロシージャを実行してもエラーにはなりません。このメッセージは、REMOVE_SUBSCRIBER
プロシージャが完了すると自動的にデキュー不可になります。
注意:
REMOVE_SUBSCRIBER
はキューに対する管理操作です。Oracle Database AQでは、アプリケーションによる管理コールおよび操作コールの同時発行が可能ですが、実行は逐次行われます。REMOVE_SUBSCRIBER
は、メッセージをエンキューまたはデキューしている保留中のコールが完了するまでブロックします。保留中のトランザクションの完了は待機しません。
例8-47 サブスクライバの削除
DECLARE subscriber sys.aq$_agent; BEGIN subscriber := sys.aq$_agent ('subscriber2', 'test2.msg_queue2@london', null); DBMS_AQADM.REMOVE_SUBSCRIBER( queue_name => 'test.multiconsumer_81_queue', subscriber => subscriber); END; /
8.7 伝播の管理
あるキューに定義された伝播スケジュールは、そのキューの有効期間中いつでも変更または削除できます。
スケジュールを削除するかわりに一時的に使用不可にすることもできます。すべての管理コールは、スケジュールがアクティブかどうかに関係なく実行されます。スケジュールがアクティブの場合、コールが処理されるまでに数秒かかります。
次のトピックでは、伝播を管理する方法について説明します。
8.7.1 キューの伝播のスケジューリング
DBMS_AQADM.SCHEDULE_PROPAGATION
は、メッセージの伝播をスケジュールします。
DBMS_AQADM.SCHEDULE_PROPAGATION ( queue_name IN VARCHAR2, destination IN VARCHAR2 DEFAULT NULL, start_time IN DATE DEFAULT SYSDATE, duration IN NUMBER DEFAULT NULL, next_time IN VARCHAR2 DEFAULT NULL, latency IN NUMBER DEFAULT 60, destination_queue IN VARCHAR2 DEFAULT NULL);
宛先は、destination
パラメータのデータベース・リンクまたはdestination_queue
パラメータのキュー名、あるいはその両方によって識別されます。データベース・リンクのみを指定すると、キューからdblinkへの伝播が行われます。別のデータベースにある複数のキューにメッセージを伝播する場合、すべての伝播が同じ頻度で行われます。
キュー表所有者のスキーマ内のプライベート・データベース・リンクが、パブリック・データベース・リンクと同じ名前の場合、AQは常にプライベート・データベース・リンクを使用します。
宛先キュー名を指定すると、キューからキューへの伝播が行われます。別のデータベース内の複数のキューにメッセージを伝播すると、キューからキューへの伝播により、各スケジュールを独立して構成できます。個別の伝播を有効化または無効化できます。
注意:
あるキューから別のデータベース内のキューへの伝播が必要な場合は、パラメータdestination
およびdestination_queue
を指定する必要があります。
キューからキューへの伝播モードは、宛先Oracle Real Application Clusters(Oracle RAC)システムに伝播する場合、透過的なフェイルオーバーをサポートします。キューからキューへの伝播では、Oracle RACでキューの所有者インスタンスが失敗した場合、データベース・リンクを再指定する必要がありません。
宛先にNULL
を指定すると、メッセージを同じデータベース内の他のキューにも伝播できます。同じ宛先に複数の受信者を持つ場合、(キューが同じかどうかにかかわらず)メッセージは、すべての受信者に同時に伝播されます。
ソース・キューは、マルチ・コンシューマ向けのキュー表内に存在する必要があります。シングル・コンシューマ・キューを指定すると、エラーORA-24039が発生します。キューまたはデータベース・リンクを参照する場合、Oracle Database Advanced Queuingはシノニムの使用をサポートしていません。
伝播next_time
およびduration
を指定すると、伝播は指定された期間、定期的に実行されます。next_time
またはduration
を指定せずに待機時間をゼロに指定すると、結果の伝播は永久に実行され、メッセージがキューに表れると伝播し、それ以外のときはアイドルになります。next_time
またはduration
が指定されずにゼロ以外の待機時間が指定されると(デフォルト)、伝播スケジュールはイベントに基づきます。伝播する必要のあるメッセージがキューにあるときに実行されるよう、スケジュールされます。システム定義の期間、メッセージがないと、伝播する新規メッセージが表れるまでジョブは実行を停止します。ジョブが実行される時間は、準備の完了しているジョブの数やジョブ・キュー・プロセスの数などの他の要因に応じて変化します。
伝播は線形バックオフ・スキームを使用して、障害が発生したスケジュールからの伝播を再試行します。あるスケジュールで続けて障害が発生したときは、最初の再試行は30秒後、次の再試行は60秒後、3回目の再試行は120秒後、というように続きます。再試行時間が現行の伝播枠の期限切れ時刻を超える場合は、次の再試行は、次の伝播枠の開始時刻に行われます。最大16回の再試行が行われた後、そのスケジュールは自動的に使用不可能になります。
注意:
再試行が次の伝播ウィンドウに移動されると、常に移動されるようになり、指数バックオフ・スキームは再試行のスケジュールを管理しません。DBMS_AQADM.SCHEDULE_PROPAGATION
のnext_time
パラメータで指定された日付関数の結果、ウィンドウ間の間隔が短くなると、再試行の失敗数はすぐに16に達し、スケジュールが無効になります。
存在しないdestination
の値を指定すると、このプロシージャはエラーをスローせずに実行します。USER_QUEUE_SCHEDULES
ビューのLAST_ERROR_MSG
列で、ランタイム伝播エラーを問い合せることができます。
関連項目:
-
ジョブ・キューおよびJnnnバックグラウンド・プロセスの詳細は、『Oracle Database管理者ガイド』のジョブ・キューの管理に関する項を参照してください。
例8-48 同じデータベース内のキューへの伝播のスケジューリング
BEGIN DBMS_AQADM.SCHEDULE_PROPAGATION( queue_name => 'test.multiconsumer_queue'); END; /
例8-49 他のデータベース内のキューへの伝播のスケジューリング
BEGIN DBMS_AQADM.SCHEDULE_PROPAGATION( queue_name => 'test.multiconsumer_queue', destination => 'another_db.world'); END; /
例8-50 キューからキューへの伝播のスケジューリング
BEGIN DBMS_AQADM.SCHEDULE_PROPAGATION( queue_name => 'test.multiconsumer_queue', destination => 'another_db.world' destination_queue => 'target_queue'); END; /
8.7.2 伝播キュー・タイプの検証
DBMS_AQADM.VERIFY_QUEUE_TYPES
は、ソース・キューおよび宛先キューのタイプが同じであるかどうかを検証します。検証の結果は、ディクショナリ表SYS.AQ$_MESSAGE_TYPES
表に格納され、以前にこのコマンドから出力されたすべての結果は上書きされます。
DBMS_AQADM.VERIFY_QUEUE_TYPES( src_queue_name IN VARCHAR2, dest_queue_name IN VARCHAR2, destination IN VARCHAR2 DEFAULT NULL, rc OUT BINARY_INTEGER);
ソースおよび宛先に同じ型のキューがない場合に指定された変換では、ソース・キュー・タイプを宛先キュー・タイプにマップする必要があります。
注意:
-
SYS.AQ$_MESSAGE_TYPES
は、同じソース・キュー、宛先キューおよびデータベース・リンクに対して複数のエントリを持ちますが、変換は異なります。 -
VERIFY_QUEUE_TYPES
チェックは、AQ伝播スケジュールごとに一度行われ、送信されるすべての伝播メッセージに対して行われるわけではありません。 -
キューのペイロードが変更された場合は、ソース・キューおよび宛先キュー間の既存の伝播スケジュールを削除して再作成する必要があります。
例8-51には、同じタイプの2つのキューが含まれます。戻り値は次のとおりです。
VQT: new style queue Compatible: 1
test.another_queue
のかわりにtest.raw_queue
(RAW型のキュー)を使用して同じ例を実行すると、この例は次の行を戻します。
VQT: new style queue Compatible: 0
例8-51 キュー・タイプの検証
SET SERVEROUTPUT ON DECLARE rc BINARY_INTEGER; BEGIN DBMS_AQADM.VERIFY_QUEUE_TYPES( src_queue_name => 'test.multiconsumer_queue', dest_queue_name => 'test.another_queue', rc => rc); DBMS_OUTPUT.PUT_LINE('Compatible: '||rc); END; /
8.7.3 伝播スケジュールの変更
DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE
は、伝播スケジュールのパラメータを変更します。キューからキューへの伝播のdestination_queue
パラメータは変更できません。
DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name IN VARCHAR2, destination IN VARCHAR2 DEFAULT NULL, duration IN NUMBER DEFAULT NULL, next_time IN VARCHAR2 DEFAULT NULL, latency IN NUMBER DEFAULT 60, destination_queue IN VARCHAR2 DEFAULT NULL);
例8-52 同じデータベース内のキューへの伝播スケジュールの変更
BEGIN DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'test.multiconsumer_queue', duration => '2000', next_time => 'SYSDATE + 3600/86400', latency => '32'); END; /
例8-53 他のデータベース内のキューへの伝播スケジュールの変更
BEGIN DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'test.multiconsumer_queue', destination => 'another_db.world', duration => '2000', next_time => 'SYSDATE + 3600/86400', latency => '32'); END; /
8.7.4 伝播スケジュールの有効化
DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE
は、以前に無効化した伝播スケジュールを有効化します。
DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE( queue_name IN VARCHAR2, destination IN VARCHAR2 DEFAULT NULL, destination_queue IN VARCHAR2 DEFAULT NULL);
例8-54 同じデータベース内のキューへの伝播の有効化
BEGIN DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE( queue_name => 'test.multiconsumer_queue'); END; /
例8-55 他のデータベース内のキューへの伝播の有効化
BEGIN DBMS_AQADM.ENABLE_PROPAGATION_SCHEDULE( queue_name => 'test.multiconsumer_queue', destination => 'another_db.world'); END; /
8.7.5 伝播スケジュールの無効化
DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE
は、以前に有効化した伝播スケジュールを無効化します。
DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE( queue_name IN VARCHAR2, destination IN VARCHAR2 DEFAULT NULL, destination_queue IN VARCHAR2 DEFAULT NULL);
例8-56 同じデータベース内のキューへの伝播の無効化
BEGIN DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE( queue_name => 'test.multiconsumer_queue'); END; /
例8-57 他のデータベース内のキューへの伝播の無効化
BEGIN DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE( queue_name => 'test.multiconsumer_queue', destination => 'another_db.world'); END; /
8.7.6 キューの伝播スケジュールの解除
DBMS_AQADM.UNSCHEDULE_PROPAGATION
は、以前にスケジュールした、あるキューから宛先へのメッセージ伝播のスケジュールを解除します。宛先は、destination
パラメータの特定のデータベース・リンク、またはdestination_queue
パラメータの名前によって識別されます。
DBMS_AQADM.UNSCHEDULE_PROPAGATION ( queue_name IN VARCHAR2, destination IN VARCHAR2 DEFAULT NULL, destination_queue IN VARCHAR2 DEFAULT NULL);
例8-58 同じデータベース内のキューへの伝播スケジュールの解除
BEGIN DBMS_AQADM.UNSCHEDULE_PROPAGATION( queue_name => 'test.multiconsumer_queue'); END; /
例8-59 他のデータベース内のキューへの伝播スケジュールの解除
BEGIN DBMS_AQADM.UNSCHEDULE_PROPAGATION( queue_name => 'test.multiconsumer_queue', destination => 'another_db.world'); END; /
8.8 Oracle Database Advanced Queuingエージェントの管理
次のトピックでは、Oracle Database Advanced Queuingエージェントを管理する方法を説明します。
8.8.1 Oracle Database Advanced Queuingエージェントの作成
DBMS_AQADM.CREATE_AQ_AGENT
は、HTTPプロトコルを使用して、Oracle Database Advanced Queuingインターネット・アクセスのためのエージェントを登録します。
DBMS_AQADM.CREATE_AQ_AGENT ( agent_name IN VARCHAR2, certificate_location IN VARCHAR2 DEFAULT NULL, enable_http IN BOOLEAN DEFAULT FALSE, enable_anyp IN BOOLEAN DEFAULT FALSE);
SYS.AQ$INTERNET_USERS
ビューには、すべてのOracle Database Advanced Queuingインターネット・エージェントのリストが表示されます。エージェントが作成、変更または削除された場合、次の条件が満たされていれば、そのエージェントに対してLDAPエントリが作成されます。
-
GLOBAL_TOPIC_ENABLED
=TRUE
-
certificate_location
を指定
8.8.2 Oracle Database Advanced Queuingエージェントの変更
DBMS_AQADM.ALTER_AQ_AGENT
は、Oracle Databaseアドバンスト・キューイング・インターネット・アクセス用に登録されたエージェントを変更します。
DBMS_AQADM.ALTER_AQ_AGENT ( agent_name IN VARCHAR2, certificate_location IN VARCHAR2 DEFAULT NULL, enable_http IN BOOLEAN DEFAULT FALSE, enable_anyp IN BOOLEAN DEFAULT FALSE);
Oracle Database Advanced Queuingエージェントが作成、変更または削除された場合、次の条件が満たされていれば、そのエージェントに対してLDAPエントリが作成されます。
-
GLOBAL_TOPIC_ENABLED
=TRUE
-
certificate_location
を指定
8.8.3 Oracle Database Advanced Queuingエージェントの削除
DBMS_AQADM.DROP_AQ_AGENT
は、以前にOracle Database Advanced Queuingインターネット・アクセスに登録されたエージェントを削除します。
DBMS_AQADM.DROP_AQ_AGENT ( agent_name IN VARCHAR2);
Oracle Database Advanced Queuingエージェントが作成、変更または削除された場合、次の条件が満たされていれば、そのエージェントに対してLDAPエントリが作成されます。
-
GLOBAL_TOPIC_ENABLED
=TRUE
-
certificate_location
を指定
8.8.4 データベース・アクセスの許可
DBMS_AQADM.ENABLE_DB_ACCESS
は、Oracle Databaseアドバンスト・キューイング・インターネット・エージェントに特定のデータベース・ユーザーの権限を付与します。このエージェントは、CREATE_AQ_AGENT
プロシージャを使用して事前に作成されています。
DBMS_AQADM.ENABLE_DB_ACCESS ( agent_name IN VARCHAR2, db_username IN VARCHAR2)
SYS.AQ$INTERNET_USERS
ビューには、すべてのOracle Database Advanced Queuingインターネット・エージェント、および権限が付与されているデータベース・ユーザーの名前のリストが表示されます。
関連項目:
保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。
8.8.5 データベース・アクセスの禁止
DBMS_AQADM.DISABLE_DB_ACCESS
は、Oracle Database Advanced Queuingインターネット・エージェントから特定のデータベース・ユーザーの権限を取り消します。これらの権限は、ENABLE_DB_ACCESS
プロシージャを使用して事前にエージェントに付与されています。
DBMS_AQADM.DISABLE_DB_ACCESS ( agent_name IN VARCHAR2, db_username IN VARCHAR2)
関連項目:
保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。
8.9 LDAPサーバーへの別名の追加
DBMS_AQADM.ADD_ALIAS_TO_LDAP
は、LDAPサーバーに別名を追加します。
DBMS_AQADM.ADD_ALIAS_TO_LDAP( alias IN VARCHAR2, obj_location IN VARCHAR2);
このコールは、LDAPのOracle Database Advanced Queuingオブジェクトの別名および識別名を使用して、Oracle Database Advanced Queuingオブジェクトを指す別名を作成します。この別名は、データベース・サーバーの識別名の直下に配置されます。別名が指すオブジェクトは、キュー、エージェントまたはConnectionFactoryです。
関連項目:
保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。