10 PL/SQLを使用したOracle Database Advanced Queuingの操作
次のトピックでは、Oracle Database Advanced Queuing (AQ)のPL/SQL操作インタフェースについて説明します。
関連項目:
-
各プログラム・インタフェースで使用可能な機能のリストは、「Oracle Database Advanced Queuing: プログラム・インタフェース」を参照してください。
-
PL/SQLインタフェースの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_AQに関する項を参照してください。
-
Javaインタフェースの詳細は、Oracle Databaseアドバンスト・キューイングJava APIリファレンスを参照してください
-
『Oracle Call Interfaceプログラマーズ・ガイド』の「その他のOCIリレーショナル関数」に関する項
-
Oracle Call Interface (OCI)の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』の「OCIプログラミングの高度なトピック」に関する項を参照してください。
10.1 保護キューの使用方法
保護キューの場合は、messages_propertiesパラメータにsender_idを指定する必要があります。
sender_idの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のMESSAGE_PROPERTIES_T型に関する項を参照してください。
保護キューを使用する場合の要件は、次のとおりです。
-
DBMS_AQADM.CREATE_AQ_AGENTを使用して、有効なOracle Database Advanced Queuingエージェントを作成済である必要があります。 -
sender_idを、保護キューに対してエンキュー権限があるデータベース・ユーザーにマップします。これには、DBMS_AQADM.ENABLE_DB_ACCESSを使用します。関連項目:
-
保護キューの詳細は、『Oracle Streams概要および管理』を参照してください。
10.2 メッセージのエンキュー
このプロシージャは、指定したキューにメッセージを追加します。
DBMS_AQ.ENQUEUE(
queue_name IN VARCHAR2,
enqueue_options IN enqueue_options_t,
message_properties IN message_properties_t,
payload IN "type_name",
msgid OUT RAW);
メッセージのエンキュー後は、メッセージ・ペイロードを更新できません。メッセージ・ペイロードを変更する場合は、メッセージをデキューして新規メッセージをエンキューする必要があります。
RAW型のペイロードを格納するために、Oracle Database Advanced Queuingでは、ペイロード・リポジトリとしてLOB列を持つキュー表が作成されます。ペイロードの最大サイズは、Oracle Database Advanced Queuingへのアクセスに使用するプログラム・インタフェースによって決まります。PL/SQL、Javaおよびプリコンパイラの場合は32K、OCIの場合は4Gです。
メッセージが受信者を指定しないでマルチ・コンシューマ・キューにエンキューされ、そのキューにサブスクライバが指定されていない(またはそのメッセージに一致するルールベースのサブスクライバが存在しない)場合、ORA-24033エラーになります。これは、配信可能な受信者またはサブスクライバが存在しないために、そのメッセージが廃棄されることを示す警告です。
複数のメッセージが同時にエンキューされると、すべてのenq_timeが同一になります。この場合、メッセージのデキュー順序は、同じenq_timeを持つ各メッセージに対して定量的に増加する変数step_noによって決まります。同じセッション中にエンキューされる2つのメッセージについて、enq_timeとstep_noの両方が同一になることはありません。
エンキュー・オプション
enqueue_optionsパラメータでは、エンキュー操作に使用可能なオプションを指定します。次の属性が含まれます。
-
visibility属性では、エンキュー・リクエストのトランザクション動作を指定します。ON_COMMIT(デフォルト)を指定すると、エンキューは現行のトランザクションの一部になります。IMMEDIATEを指定すると、エンキュー操作は操作の最後にコミットする自律型トランザクションになります。LOBロケータを使用するときは、
IMMEDIATEオプションを使用しないでください。LOBロケータは、トランザクションが継続している間のみ有効です。IMMEDIATEオプションを使用すると、トランザクションが自動的にコミットされるため、ロケータは有効になりません。バッファ済メッセージを使用するには、
visibility属性をIMMEDIATEに設定する必要があります。 -
relative_msgid属性では、順序逸脱操作で参照されるメッセージのメッセージIDを指定します。このパラメータは、sequence_deviationでBEFORE属性を指定しないと無視されます。 -
sequence_deviation属性では、すでにキューにある他のメッセージを基準にしてメッセージのデキュー時期を指定します。BEFOREを指定すると、メッセージはrelative_msgidで指定したメッセージの前に配置されます。TOPを指定すると、メッセージは他のすべてのメッセージの前に配置されます。メッセージに
sequence_deviationを指定すると、そのメッセージに指定できる遅延および優先順位の値が制限されます。遅延の値は、このメッセージより後にエンキューされるメッセージの遅延以下に設定する必要があります。優先順位は、このメッセージより後にエンキューされるメッセージの優先順位以上に設定する必要があります。注意:
Oracle Database Advanced Queuing 10gリリース1 (10.1)より前のリリースでは、
message_groupingがTRANSACTIONALに設定されている場合、sequence_deviation属性は無効です。順序逸脱機能は、Oracle Database Advanced Queuing 10gリリース2 (10.2)では非推奨になりました。
-
transformationtransformation属性では、メッセージのエンキュー前に適用する変換を指定します。変換ファンクションの戻り型は、キューの型と一致する必要があります。 -
delivery_mode属性のデフォルトはPERSISTENTで、メ_ッセージは永続メッセージとしてエンキューされます。BUFFEREDに設定すると、メッセージはバッファ済メッセージとしてエンキューされます。NULL値は設定できません。
メッセージ・プロパティ
message_propertiesパラメータには、Oracle Database Advanced Queuingでメッセージを個別に管理するために使用される情報が含まれます。次の属性が含まれます。
-
priority属性では、メッセージの優先順位を指定します。これには、負数も含めたあらゆる数値を使用できます。数値が小さいほど高い優先度を示します。 -
delay属性では、メッセージがWAITING状態になっている秒数を指定します。この秒数をすぎると、メッセージはREADY状態になり、デキュー可能になります。NO_DELAYを指定すると、メッセージは即時にデキュー可能になります。msgidを指定してデキューすると、delay指定がオーバーライドされます。注意:
バッファ済メッセージではdelayはサポートされません。
-
expiration属性では、メッセージがREADY状態になった後でデキュー可能な秒数を指定します。期限切れになる前にデキューされない場合、メッセージはEXPIRED状態で例外キューに移されます。NEVERを指定すると、メッセージは期限切れになりません。注意:
メッセージの遅延および期限切れの処理は、キュー・モニター(
QMN)のバックグラウンド・プロセスによって行われます。Oracle Database Advanced Queuingの遅延および期限切れの機能を使用するときは、データベースのQMNプロセスを開始する必要があります。 -
correlation属性は、エンキュー時にメッセージのプロデューサが指定する識別子です。 -
attempts属性は、メッセージをデキューするために実行された試行回数を指定します。このパラメータを、エンキュー時刻に設定することはできません。 -
recipient_listパラメータは、マルチ・コンシューマに対応するキューにのみ有効です。デフォルトの受信者はキューのサブスクライバです。 -
exception_queue属性では、正常に処理できない場合にメッセージが移されるキューの名前を指定します。指定した例外キューが移動時に存在しない場合、そのメッセージは、キュー表に関連付けられているデフォルトの例外キューに移動され、アラート・ログに警告ログが記録されます。 -
エンキュー時にメッセージ・プロパティで指定した
delivery_modeの値は無視されます。エンキュー・オプションで指定した値を使用して、メッセージの配信モードが設定されます。エンキュー・オプションで配信モードを指定しなければ、デフォルトでPERSISTENTに設定されます。 -
enqueue_time属性では、メッセージがエンキューされた時刻を指定します。この値はシステムにより決定され、ユーザーはエンキュー時に設定できません。注意:
システム・クロックの季節変動情報(標準時と夏時間の間の切替えなど)は各キュー表とともに格納されるため、季節変動は自動的に
enqueue_timeに反映されます。他のなんらかの理由でシステム・クロックに変更があった場合は、Oracle Database Advanced Queuing用のデータベースを再起動して変更後の時刻を取得する必要があります。 -
state属性では、デキュー時のメッセージの状態を指定します。このパラメータを、エンキュー時刻に設定することはできません。 -
sender_id属性は、メッセージ・プロデューサがエンキュー時に指定したaq$_agent型の識別子です。 -
original_msgid属性は、Oracle Database AQでメッセージの伝播に使用されます。
-
transaction_group属性では、メッセージのトランザクション・グループを指定します。この属性は、DBMS_AQ.DEQUEUE_ARRAYでのみ設定されます。DBMS_AQ.ENQUEUEまたはDBMS_AQ.ENQUEUE_ARRAYを介してメッセージのトランザクション・グループを設定する場合、この属性は使用できません。 -
user_property属性はオプションです。ペイロードの追加情報の格納に使用します。
次のトピックの例には、「Oracle Database Advanced Queuing管理インタフェース」の例と同じユーザー、メッセージ型、キュー表およびキューを使用しています。まだこれらの構造をテスト環境で作成していない場合は、次の例を実行する必要があります。
例8-1では、管理権限を持つユーザーとして接続する必要があります。前述のリストの他の例では、ユーザーtest_admとして接続できます。キューの作成後に、「キューの開始」に示すようにキューを開始する必要があります。特に明記しないかぎり、すべての例は通常のキュー・ユーザー'test'として接続して実行できます。
LOB型メッセージのエンキュー
例10-3では、例8-1で作成したtest.lob_typeメッセージ・ペイロード・オブジェクト型を使用して、プロシージャblobenqueue()を作成します。エンキュー時に、LOB属性がEMPTY_BLOBに設定されます。エンキューの完了後、トランザクションがコミットされる前に、test.lob_qtabキュー表のuser_data列からLOB属性が選択されます。LOBデータは、LOBインタフェース(OCIおよびPL/SQLの両方を介して使用可能)を使用してキューに書き込まれます。実際のエンキュー操作は、を参照してください。
デキュー時には、メッセージ・ペイロードにLOBロケータが含まれます。デキュー後、トランザクションがコミットされる前に、このLOBロケータを使用してLOBデータを読み取ることができます。例10-14を参照してください。
シングル・コンシューマ・キューへの複数メッセージのエンキュー
マルチ・コンシューマ・キューへの複数メッセージのエンキュー
例10-6では、ユーザー'test_adm'として接続し、キューtest.multiconsumer_queueにサブスクライバREDおよびGREENを追加する必要があります。この2つのサブスクライバは例10-7で必要になります。
例10-7では、送信者001からの複数のメッセージをエンキューします。MESSAGE 1はすべてのキュー・サブスクライバを対象としています。MESSAGE 2はREDおよびBLUEを対象としています。これらのメッセージは、例10-17でデキューされます。
グループ化されたメッセージのエンキュー
遅延および期限切れのメッセージのエンキュー
例10-9のアプリケーションでは、メッセージは現時点の1週間前から3週間後までの期間内にデキューされる必要があります。期限切れは最も早いデキュー時刻から計算されるため、この場合は期限切れを2週間に設定する必要があります。
例10-1 キュー名とペイロードを指定したメッセージのエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
message := test.message_typ(001, 'TEST MESSAGE', 'First message to obj_queue');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
COMMIT;
END;
/例10-2 優先順位を指定したメッセージのエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.order_typ;
BEGIN
message := test.order_typ(002, 'PRIORITY MESSAGE', 'priority 30');
message_properties.priority := 30;
DBMS_AQ.ENQUEUE(
queue_name => 'test.priority_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
COMMIT;
END;
/
例10-3 LOB型メッセージのエンキュー・プロシージャの作成
CREATE OR REPLACE PROCEDURE blobenqueue(msgno IN NUMBER) AS
enq_userdata test.lob_typ;
enq_msgid RAW(16);
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
lob_loc BLOB;
buffer RAW(4096);
BEGIN
buffer := HEXTORAW(RPAD('FF', 4096, 'FF'));
enq_userdata := test.lob_typ(msgno, 'Large Lob data', EMPTY_BLOB(), msgno);
DBMS_AQ.ENQUEUE(
queue_name => 'test.lob_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => enq_userdata,
msgid => enq_msgid);
SELECT t.user_data.data INTO lob_loc
FROM lob_qtab t
WHERE t.msgid = enq_msgid;
DBMS_LOB.WRITE(lob_loc, 2000, 1, buffer );
COMMIT;
END;
/ 例10-4 LOB型メッセージのエンキュー
BEGIN
FOR i IN 1..5 LOOP
blobenqueue(i);
END LOOP;
END;
/例10-5 複数メッセージのエンキュー
SET SERVEROUTPUT ON
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
message := test.message_typ(001, 'ORANGE', 'ORANGE enqueued first.');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
message := test.message_typ(001, 'ORANGE', 'ORANGE also enqueued second.');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
message := test.message_typ(001, 'YELLOW', 'YELLOW enqueued third.');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
message := test.message_typ(001, 'VIOLET', 'VIOLET enqueued fourth.');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
message := test.message_typ(001, 'PURPLE', 'PURPLE enqueued fifth.');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
message := test.message_typ(001, 'PINK', 'PINK enqueued sixth.');
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
COMMIT;
END;
/
例10-6 サブスクライバREDおよびGREENの追加
DECLARE
subscriber sys.aq$_agent;
BEGIN
subscriber := sys.aq$_agent('RED', NULL, NULL);
DBMS_AQADM.ADD_SUBSCRIBER(
queue_name => 'test.multiconsumer_queue',
subscriber => subscriber);
subscriber := sys.aq$_agent('GREEN', NULL, NULL);
DBMS_AQADM.ADD_SUBSCRIBER(
queue_name => 'test.multiconsumer_queue',
subscriber => subscriber);
END;
/
例10-7 マルチ・コンシューマ・キューへの複数メッセージのエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
recipients DBMS_AQ.aq$_recipient_list_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
message := test.message_typ(001, 'MESSAGE 1','For queue subscribers');
DBMS_AQ.ENQUEUE(
queue_name => 'test.multiconsumer_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
message := test.message_typ(001, 'MESSAGE 2', 'For two recipients');
recipients(1) := sys.aq$_agent('RED', NULL, NULL);
recipients(2) := sys.aq$_agent('BLUE', NULL, NULL);
message_properties.recipient_list := recipients;
DBMS_AQ.ENQUEUE(
queue_name => 'test.multiconsumer_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
COMMIT;
END;
/
例10-8 グループ化されたメッセージのエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
FOR groupno in 1..3 LOOP
FOR msgno in 1..3 LOOP
message := test.message_typ(
001,
'GROUP ' || groupno,
'Message ' || msgno || ' in group ' || groupno);
DBMS_AQ.ENQUEUE(
queue_name => 'test.group_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
END LOOP;
COMMIT;
END LOOP;
END;
/
例10-9 遅延と期限切れを指定したメッセージのエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
message := test.message_typ(001, 'DELAYED', 'Message is delayed one week.');
message_properties.delay := 7*24*60*60;
message_properties.expiration := 2*7*24*60*60;
DBMS_AQ.ENQUEUE(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
COMMIT;
END;
/
例10-10 変換を指定したメッセージのエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
message := test.message_typ(001, 'NORMAL MESSAGE', 'enqueued to obj_queue');
enqueue_options.transformation := 'message_order_transform';
DBMS_AQ.ENQUEUE(
queue_name => 'test.priority_queue',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
COMMIT;
END;
/10.3 メッセージの配列のエンキュー
ENQUEUE_ARRAY関数を使用して、対応する配列のメッセージ・プロパティを使用するペイロードの配列をエンキューします。
DBMS_AQ.ENQUEUE_ARRAY( queue_name IN VARCHAR2, enqueue_options IN enqueue_options_t, array_size IN PLS_INTEGER, message_properties_array IN message_properties_array_t, payload_array IN VARRAY, msid_array OUT msgid_array_t) RETURN PLS_INTEGER;
結果には、エンキューされたメッセージのメッセージ識別子の配列が出力されます。関数はエンキューに成功したメッセージの数を戻します。
バッファ済メッセージの場合、配列のエンキューはサポートされていませんが、array_sizeを1に設定してDBMS_AQ.ENQUEUE_ARRAY()を使用すると、バッファ済メッセージをエンキューできます。
message_properties_arrayパラメータは、メッセージ・プロパティの配列です。このレコードには、ペイロードの配列の各要素に対応する要素が必要です。配列内のすべてのメッセージの配信モードは同じです。
ペイロード構造は、VARRAYまたはネストした表のいずれかです。メッセージIDは、DBMS_AQ.msgid_array_t型のRAW(16)のエントリの配列に戻されます。
リレーショナルDB環境における配列操作と同様に、すべての状況に対応可能な1つの最適な配列サイズを指定することはできません。アプリケーション開発者は、様々な配列サイズをテストして、各アプリケーションにとって最適な値を決定する必要があります。
関連項目:
例10-11 メッセージの配列のエンキュー
DECLARE
enqueue_options DBMS_AQ.enqueue_options_t;
msg_prop_array DBMS_AQ.message_properties_array_t;
msg_prop DBMS_AQ.message_properties_t;
payload_array test.msg_table;
msgid_array DBMS_AQ.msgid_array_t;
retval PLS_INTEGER;
BEGIN
payload_array := msg_table(
message_typ(001, 'MESSAGE 1', 'array enqueued to obj_queue'),
message_typ(001, 'MESSAGE 2', 'array enqueued to obj_queue'));
msg_prop_array := DBMS_AQ.message_properties_array_t(msg_prop, msg_prop);
retval := DBMS_AQ.ENQUEUE_ARRAY(
queue_name => 'test.obj_queue',
enqueue_options => enqueue_options,
array_size => 2,
message_properties_array => msg_prop_array,
payload_array => payload_array,
msgid_array => msgid_array);
COMMIT;
END;/10.4 1つ以上のキューのリスニング
このプロシージャでは、監視するキューを指定します(複数可)。
DBMS_AQ.LISTEN( agent_list IN aq$_agent_list_t, wait IN BINARY_INTEGER DEFAULT FOREVER, listen_delivery_mode IN PLS_INTEGER DEFAULT PERSISTENT, agent OUT sys.aq$_agent message_delivery_mode OUT PLS_INTEGER); TYPE aq$_agent_list_t IS TABLE of aq$_agent INDEXED BY BINARY_INTEGER;
このコールの引数に、エージェント・リストがあります。各エージェントは、名前、アドレスおよびプロトコルの一意の組合せで識別されます。
監視対象のキューは、リストされている各エージェントのアドレス・フィールドで指定されます。エージェントには、監視対象の各キューに対するデキュー権限が必要です。マルチ・コンシューマ・キューを監視する場合はエージェント名を指定する必要がありますが、シングル・コンシューマ・キューの場合、エージェント名を指定する必要はありません。アドレスでサポートされているのは、ローカル・キューのみです。プロトコルは、将来の使用に備えて確保されています。
注意:
マルチ・コンシューマ・キューのリスニングはJava APIではサポートされていません。
listen_delivery_modeパラメータでは、エージェントの対象メッセージの型を指定します。デフォルトのPERSISTENTの場合、エージェントには永続メッセージのみが通知されます。BUFFEREDに設定すると、エージェントにはバッファ済メッセージのみが通知されます。PERSISTENT_OR_BUFFEREDに設定すると、エージェントには両方の型が通知されます。
このコールは、リストにあるエージェントによって処理可能なメッセージがある場合にエージェントとメッセージ型を戻すブロッキング・コールです。処理可能なエージェントが複数ある場合、最初にリストされたエージェントのみが戻されます。待機期限切れになった時点で1つもメッセージがない場合は、エラーになります。
Listenコールから正常に戻っても、指定されたキューの1つにリストされたいずれかのエージェントのメッセージがあることを意味しているにすぎません。対象となっているエージェントは、関連メッセージを継続してデキューする必要があります。
注意:
非永続キューにはLISTENはコールできません。
test.obj_queueとtest.priority_queueの両方にメッセージ(それぞれ例10-1および例10-2でエンキュー)が含まれていますが、例10-12では次の値のみが戻されます。
Message in Queue: "TEST"."OBJ_QUEUE"
test_agent_listでエージェントの順序が保持される場合、test.priority_queueはtest.obj_queueの前に表示されるため、この例では次のように戻されます。
Message in Queue: "TEST"."PRIORITY_QUEUE"
関連項目:
例10-12 シングル・コンシューマ・キューのリスニング(タイムアウト0(ゼロ))
SET SERVEROUTPUT ON
DECLARE
agent sys.aq$_agent;
test_agent_list DBMS_AQ.aq$_agent_list_t;
BEGIN
test_agent_list(1) := sys.aq$_agent(NULL, 'test.obj_queue', NULL);
test_agent_list(2) := sys.aq$_agent(NULL, 'test.priority_queue', NULL);
DBMS_AQ.LISTEN(
agent_list => test_agent_list,
wait => 0,
agent => agent);
DBMS_OUTPUT.PUT_LINE('Message in Queue: ' || agent.address);
END;
/
10.5 メッセージのデキュー
このプロシージャでは、メッセージを指定のキューからデキューします。
DBMS_AQ.DEQUEUE(
queue_name IN VARCHAR2,
dequeue_options IN dequeue_options_t,
message_properties OUT message_properties_t,
payload OUT "type_name",
msgid OUT RAW);
デキューの対象として、永続メッセージのみ、バッファ・メッセージのみ、またはその両方のいずれかを選択できます。次に示すデキュー・オプションのリストのdelivery_modeを参照してください。
関連項目:
デキュー・オプション
dequeue_optionsパラメータでは、デキュー操作に使用可能なオプションを指定します。次の属性が含まれます。
-
コンシューマは、
DBMS_AQADM.ADD_SUBSCRIBERプロシージャのAQ$_AGENT型またはメッセージ・プロパティの受信者リストに使用した名前を指定して、キューからメッセージをデキューできます。値を指定すると、consumer_nameと一致するメッセージのみがアクセスされます。キューがマルチ・コンシューマ用に設定されていない場合は、このフィールドをNULL(デフォルト)に設定する必要があります。 -
dequeue_mode属性では、デキュー関連のロック動作を指定します。BROWSEを指定すると、メッセージはロックを取得せずにデキューされます。LOCKEDを指定すると、メッセージはデキューされ、トランザクションの期間中は書込みロックが継続します。REMOVEを指定すると、メッセージはデキューされて削除されます(デフォルト)。メッセージは保存プロパティに基づいてキュー表に保存されます。REMOVE_NO_DATAを指定すると、メッセージは更新済または削除済としてマークされます。 -
navigation属性では、デキュー対象メッセージの位置を指定します。FIRST_MESSAGEを指定すると、使用可能で検索基準と一致する最初のメッセージがデキューされます。NEXT_MESSAGEを指定すると、検索基準と一致する次に使用可能なメッセージがデキューされます(デフォルト)。前のメッセージがメッセージ・グループに属する場合は、そのメッセージ・グループに属するメッセージの中から、検索基準に一致する次に使用可能なメッセージがデキューされます。NEXT_TRANSACTIONを指定すると、現行のトランザクション・グループ内のメッセージがスキップされ、次のトランザクション・グループの最初のメッセージがデキューされます。この設定を使用できるのは、キューでメッセージのグループ化が可能な場合のみです。 -
visibility属性では、新規メッセージのデキュー時期を指定します。ON_COMMITを指定すると、デキューは現行のトランザクションの一部になります(デフォルト)。IMMEDIATEを指定すると、デキュー操作は操作の最後にコミットする自律型トランザクションとなります。visibility属性は、BROWSEデキュー・モードでは無視されます。配信モード
DBMS_AQ.BUFFEREDまたはDBMS_AQ.PERSISTENT_OR_BUFFEREDでメッセージをデキューする場合は、visibilityを常にIMMEDIATEに設定する必要があります。 -
wait属性では、検索基準と一致する使用可能なメッセージがない場合の待機時間を指定します。数値を指定すると、操作はその秒数だけ待機します。FOREVERを指定すると、操作は永続的に待機します(デフォルト)。NO_WAITを指定すると、操作は待機しません。 -
msgid属性では、デキュー対象メッセージのメッセージ識別子を指定します。msgidを指定しないかぎり、READY状態のメッセージのみがデキューされます。 -
correlation属性では、デキュー対象メッセージの相関識別子を指定します。一連のデキュー・コール間では、
FIRST_MESSAGEナビゲーション・オプションを指定しないと相関識別子を変更できません。相関識別子は、Oracle Database Advanced Queuingでは解釈されない、アプリケーション定義の識別子です。パーセント記号やアンダースコアなど、特殊なパターン・マッチング文字を使用できます。複数のメッセージがパターンと一致する場合、デキュー順序は不定になり、キューのソート順序は無視されます。
注意:
バッファ済メッセージの場合、デキュー・オプション
correlationおよびdeq_conditionの両方がサポートされますが、索引を作成してこれらの問合せを最適化することはできません。 -
deq_condition属性は、SQL問合せのWHERE句に似たブール式です。このブール式には、メッセージ・プロパティの条件、ユーザー・データ・プロパティ(オブジェクト・ペイロードのみ)およびPL/SQLまたはSQL関数を含めることができます。メッセージ・ペイロード(オブジェクト・ペイロード)のデキュー条件を指定するには、句にオブジェクト・タイプの属性を使用します。ペイロードが格納されたキュー・テーブルの特定の列を指定するには、各属性の前に修飾子として
tab.user_dataを追加する必要があります。deq_condition属性は4000文字以内です。複数のメッセージがデキュー条件を満たす場合、デキュー順序は不定になり、キューのソート順は考慮されません。 -
transformation属性では、メッセージがデキューされてからコール側に戻されるまでに適用される変換を指定します。 -
delivery_mode属性では、デキューするメッセージの型を指定します。DBMS_AQ.PERSISTENTに設定すると、永続メッセージのみがデキューされます。DBMS_AQ.BUFFEREDに設定すると、バッファ済メッセージのみがデキューされます。デフォルトの
DBMS_AQ.PERSISTENT_OR_BUFFEREDに設定すると、永続メッセージとバッファ済メッセージの両方がデキューされます。デキューされたメッセージのメッセージ・プロパティのdelivery_mode属性は、そのメッセージがバッファ済メッセージであったか永続メッセージであったかを示します。
デキューの順序は、デキュー・オプションのメッセージ識別子および相関識別子でオーバーライドされないかぎり、キュー表の作成時に指定されたソート順によって決定されます。
キュー操作には、データベース読込み一貫性メカニズムが適用されます。たとえば、トランザクションによる参照が始まってからエンキューされたメッセージを、BROWSEコールでは参照できません。
コミット時間キューは、近似CSCNに基づいて確定的な順序を確立できないかぎり、BROWSEまたはDEQUEUEのコールではメッセージを参照できません。
dequeue_conditionsパラメータのnavigation属性がNEXT_MESSAGE (デフォルト)の場合、後続のデキューでは、最初のデキューで取得されたスナップショットに基づいて、キューからメッセージが取り出されます。したがって、最初のデキュー・コマンド以降にエンキューされたメッセージは、キューに残っているメッセージがすべて処理された後にのみ処理されます。すべてのメッセージがエンキュー済の場合、またはキューに優先順位ベースの順序が設定されていない場合、これは問題ではありません。ただし、アプリケーションでキューにある最も優先順位の高いメッセージを処理する必要がある場合は、FIRST_MESSAGEナビゲーション・オプションを使用する必要があります。
注意:
同時にエンキューされるメッセージがある場合には、FIRST_MESSAGEナビゲーション・オプションを使用すると効率的です。FIRST_MESSAGEオプションを指定しないと、Oracle Database Advanced Queuingでは最初のデキュー・コマンドと同様のスナップショットが継続的に生成されるため、パフォーマンスの低下につながります。FIRST_MESSAGEオプションを指定すると、Oracle Database Advanced Queuingでは、すべてのデキュー・コマンドに新規のスナップショットが使用されます。
メッセージをグループ化できるキューに同一トランザクションのメッセージがエンキューされると、グループが形成されます。トランザクションに1つのメッセージしかエンキューされていない場合でも、事実上1つのグループが形成されます。1つのトランザクションでグループ化できるメッセージの数に、上限はありません。
メッセージをグループ化できないキューでは、LOCKEDまたはREMOVEモードのデキューによって1つのメッセージのみがロックされます。それに対して、グループの一部であるメッセージをデキューする操作では、グループ全体がロックされます。これは、グループのメッセージ全体を1つの単位として処理する必要がある場合に有効です。
グループ内のすべてのメッセージがデキューされている場合、そのデキューはグループ内のすべてのメッセージが処理済であることを示すエラーを戻します。その後、アプリケーションはNEXT_TRANSACTIONを使用して、次の使用可能なグループからのメッセージのデキューを開始します。使用可能なグループがない場合は、dequeue_optionsのwait属性で指定した期間が終了するとデキューがタイムアウトになります。
一般的には、メッセージのコンシューマはデキュー・インタフェースによってメッセージにアクセスすると考えられます。処理済または処理が終了していないメッセージは、メッセージIDまたはSELECTコマンドを使用して参照できます。
例10-13では、例10-1でエンキューされたメッセージが戻されます。戻り値は次のとおりです。
From Sender No.1 Subject: TEST MESSAGE Text: First message to obj_queue
関連項目:
-
『Oracle Streams概要および管理』のコミット時間キューに関する項
LOB型メッセージのデキュー
例10-14では、Example 10-4でエンキューされたLOBタイプ・メッセージをデキューするために、blobdequeue()プロシージャを作成します。実際のデキューは例10-15で示されています。戻り値は次のとおりです。
Amount of data read: 2000 Amount of data read: 2000 Amount of data read: 2000 Amount of data read: 2000 Amount of data read: 2000
グループ化されたメッセージのデキュー
例10-16を実行すると、例10-8でエンキューした、グループ化されたメッセージをデキューできます。戻り値は次のとおりです。
GROUP 1: Message 1 in group 1 GROUP 1: Message 2 in group 1 GROUP 1: Message 3 in group 1 Finished GROUP 1 GROUP 2: Message 1 in group 2 GROUP 2: Message 2 in group 2 GROUP 2: Message 3 in group 2 Finished GROUP 2 GROUP 3: Message 1 in group 3 GROUP 3: Message 2 in group 3 GROUP 3: Message 3 in group 3 Finished GROUP 3 No more messages
マルチ・コンシューマ・キューからのデキュー
例10-17を実行すると、例10-7でREDについてエンキューしたメッセージをデキューできます。REDをGREENに変更し、さらにBLUEに変更すると、それぞれのメッセージのデキューにも使用できます。例の出力は、それぞれ異なります。
REDはマルチ・コンシューマ・キューのサブスクライバで、MESSAGE 2の指定の受信者でもあるため、両方のメッセージを取得します。
Message: MESSAGE 1 .. For queue subscribers Message: MESSAGE 2 .. For two recipients No more messages for RED
GREENはサブスクライバにすぎないため、受信者が指定されていないキュー内のメッセージ(この場合はMESSAGE 1)のみを取得します。
Message: MESSAGE 1 .. For queue subscribers No more messages for GREEN
BLUEはキューのサブスクライバではありませんが、MESSAGE 2の宛先に指定されています。
Message: MESSAGE 2 .. For two recipients No more messages for BLUE
例10-18では、例10-5でエンキューしたメッセージをPINKが見つかるまで参照し、PINKを削除します。この例は、次の行を戻します。
Browsed Message Text: ORANGE enqueued first. Browsed Message Text: ORANGE also enqueued second. Browsed Message Text: YELLOW enqueued third. Browsed Message Text: VIOLET enqueued fourth. Browsed Message Text: PURPLE enqueued fifth. Browsed Message Text: PINK enqueued sixth. Removed Message Text: PINK enqueued sixth.
デキュー・モード
例10-19では、例10-5でエンキューしたメッセージをPURPLEが見つかるまでロック・モードでプレビューし、PURPLEを削除します。この例は、次の行を戻します。
Locked Message Text: ORANGE enqueued first. Locked Message Text: ORANGE also enqueued second. Locked Message Text: YELLOW enqueued third. Locked Message Text: VIOLET enqueued fourth. Locked Message Text: PURPLE enqueued fifth. Removed Message Text: PURPLE enqueued fifth.
例10-13 オブジェクト型メッセージのデキュー
SET SERVEROUTPUT ON
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
dequeue_options.navigation := DBMS_AQ.FIRST_MESSAGE;
DBMS_AQ.DEQUEUE(
queue_name => 'test.obj_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE('From Sender No.'|| message.sender_id);
DBMS_OUTPUT.PUT_LINE('Subject: '||message.subject);
DBMS_OUTPUT.PUT_LINE('Text: '||message.text);
COMMIT;
END;
/例10-14 LOB型メッセージのデキュー・プロシージャの作成
CREATE OR REPLACE PROCEDURE blobdequeue(msgno IN NUMBER) AS
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
msgid RAW(16);
payload test.lob_typ;
lob_loc BLOB;
amount BINARY_INTEGER;
buffer RAW(4096);
BEGIN
DBMS_AQ.DEQUEUE(
queue_name => 'test.lob_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => payload,
msgid => msgid);
lob_loc := payload.data;
amount := 2000;
DBMS_LOB.READ(lob_loc, amount, 1, buffer);
DBMS_OUTPUT.PUT_LINE('Amount of data read: '|| amount);
COMMIT;
END;
/例10-15 LOB型メッセージのデキュー
BEGIN
FOR i IN 1..5 LOOP
blobdequeue(i);
END LOOP;
END;
/例10-16 グループ化されたメッセージのデキュー
SET SERVEROUTPUT ON
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
no_messages exception;
end_of_group exception;
PRAGMA EXCEPTION_INIT (no_messages, -25228);
PRAGMA EXCEPTION_INIT (end_of_group, -25235);
BEGIN
dequeue_options.wait := DBMS_AQ.NO_WAIT;
dequeue_options.navigation := DBMS_AQ.FIRST_MESSAGE;
LOOP
BEGIN
DBMS_AQ.DEQUEUE(
queue_name => 'test.group_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE(message.subject || ': ' || message.text );
dequeue_options.navigation := DBMS_AQ.NEXT_MESSAGE;
EXCEPTION
WHEN end_of_group THEN
DBMS_OUTPUT.PUT_LINE ('Finished ' || message.subject);
COMMIT;
dequeue_options.navigation := DBMS_AQ.NEXT_TRANSACTION;
END;
END LOOP;
EXCEPTION
WHEN no_messages THEN
DBMS_OUTPUT.PUT_LINE ('No more messages');
END;
/例10-17 マルチ・コンシューマ・キューからのREDのメッセージのデキュー
SET SERVEROUTPUT ON
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
no_messages exception;
PRAGMA EXCEPTION_INIT (no_messages, -25228);
BEGIN
dequeue_options.wait := DBMS_AQ.NO_WAIT;
dequeue_options.consumer_name := 'RED';
dequeue_options.navigation := DBMS_AQ.FIRST_MESSAGE;
LOOP
BEGIN
DBMS_AQ.DEQUEUE(
queue_name => 'test.multiconsumer_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE('Message: '|| message.subject ||' .. '|| message.text );
dequeue_options.navigation := DBMS_AQ.NEXT_MESSAGE;
END;
END LOOP;
EXCEPTION
WHEN no_messages THEN
DBMS_OUTPUT.PUT_LINE ('No more messages for RED');
COMMIT;
END;
/
例10-18 参照モードによるデキューと指定のメッセージの削除
SET SERVEROUTPUT ON
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
dequeue_options.dequeue_mode := DBMS_AQ.BROWSE;
LOOP
DBMS_AQ.DEQUEUE(
queue_name => 'test.obj_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE ('Browsed Message Text: ' || message.text);
EXIT WHEN message.subject = 'PINK';
END LOOP;
dequeue_options.dequeue_mode := DBMS_AQ.REMOVE;
dequeue_options.msgid := message_handle;
DBMS_AQ.DEQUEUE(
queue_name => 'test.obj_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE('Removed Message Text: ' || message.text);
COMMIT;
END;
/
例10-19 ロック・モードによるデキューと指定のメッセージの削除
SET SERVEROUTPUT ON
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
message_properties DBMS_AQ.message_properties_t;
message_handle RAW(16);
message test.message_typ;
BEGIN
dequeue_options.dequeue_mode := DBMS_AQ.LOCKED;
LOOP
DBMS_AQ.dequeue(
queue_name => 'test.obj_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE('Locked Message Text: ' || message.text);
EXIT WHEN message.subject = 'PURPLE';
END LOOP;
dequeue_options.dequeue_mode := DBMS_AQ.REMOVE;
dequeue_options.msgid := message_handle;
DBMS_AQ.DEQUEUE(
queue_name => 'test.obj_queue',
dequeue_options => dequeue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);
DBMS_OUTPUT.PUT_LINE('Removed Message Text: ' || message.text);
COMMIT;
END;
/
10.6 メッセージの配列のデキュー
DEQUEUE_ARRAY関数を使用して、ペイロードの配列および対応する配列のメッセージ・プロパティをデキューします。
DBMS_AQ.DEQUEUE_ARRAY( queue_name IN VARCHAR2, dequeue_options IN dequeue_options_t, array_size IN PLS_INTEGER, message_properties_array OUT message_properties_array_t, payload_array OUT VARRAY, msgid_array OUT msgid_array_t) RETURN PLS_INTEGER;
結果には、デキューされたメッセージのペイロードの配列、メッセージIDおよびメッセージ・プロパティが出力されます。また、正常にデキューされたメッセージの数も戻されます。
バッファ済メッセージの場合、配列のデキューはサポートされていませんが、array_sizeを1に設定してDBMS_AQ.DEQUEUE_ARRAY()を使用すると、バッファ済メッセージをデキューできます。
ペイロード構造は、VARRAYまたはネストした表のいずれかです。メッセージ識別子は、DBMS_AQ.msgid_array_t型のRAW(16)のエントリの配列に戻されます。メッセージ・プロパティは、DBMS_AQ.message_properties_array_t型の配列に戻されます。
リレーショナルDB環境における配列操作と同様に、すべての状況に対応可能な1つの最適な配列サイズを指定することはできません。アプリケーション開発者は、様々な配列サイズをテストして、各アプリケーションにとって最適な値を決定する必要があります。
DBMS_AQ.DEQUEUEで使用可能なデキュー・オプションはすべて、DBMS_AQ.DEQUEUE_ARRAYでも使用できます。デキューの対象として、永続メッセージのみ、バッファ・メッセージのみ、またはその両方のいずれかを選択できます。また、dequeue_optionsのnavigation属性には、DBMS_AQ.DEQUEUE_ARRAYに固有の2つのオプションが用意されています。
メッセージをデキューするときは、トランザクション・グループのすべてのメッセージを1つのコールでデキューできます。また、複数のトランザクション・グループのメッセージをデキューすることもできます。いずれの方法も、次のナビゲーション・メソッドを使用して指定できます。
-
NEXT_MESSAGE_ONE_GROUP -
FIRST_MESSAGE_ONE_GROUP -
NEXT_MESSAGE_MULTI_GROUP -
FIRST_MESSAGE_MULTI_GROUP
ナビゲーション・メソッドNEXT_MESSAGE_ONE_GROUPは、検索基準と一致したメッセージを次の使用可能なトランザクション・グループから配列にデキューします。ナビゲーション・メソッドFIRST_MESSAGE_ONE_GROUPは、位置をキューの先頭にリセットし、1つのトランザクション・グループから使用可能かつ検索基準と一致するすべてのメッセージをデキューします。
デキューされるメッセージの数は、配列サイズの制限によって決まります。トランザクション・グループ内のメッセージ数がarray_sizeを超えている場合は、複数のDEQUEUE_ARRAYをコールして、そのトランザクション・グループのすべてのメッセージをデキューする必要があります。
ナビゲーション・メソッドNEXT_MESSAGE_MULTI_GROUPおよびFIRST_MESSAGE_MULTI_GROUPは、それぞれのカウンターパートONE_GROUPと同様に機能しますが、1つのトランザクション・グループには制限されません。配列にデキューされる各メッセージには、一連のメッセージ・プロパティが対応付けられています。メッセージ・プロパティtransaction_groupによって、同じトランザクション・グループに属するメッセージが特定されます。
例10-20では、例10-11でエンキューされたメッセージがデキューされます。戻り値は次のとおりです。
Number of messages dequeued: 2
関連項目:
例10-20 メッセージの配列のデキュー
SET SERVEROUTPUT ON
DECLARE
dequeue_options DBMS_AQ.dequeue_options_t;
msg_prop_array DBMS_AQ.message_properties_array_t :=
DBMS_AQ.message_properties_array_t();
payload_array test.msg_table;
msgid_array DBMS_AQ.msgid_array_t;
retval PLS_INTEGER;
BEGIN
retval := DBMS_AQ.DEQUEUE_ARRAY(
queue_name => 'test.obj_queue',
dequeue_options => dequeue_options,
array_size => 2,
message_properties_array => msg_prop_array,
payload_array => payload_array,
msgid_array => msgid_array);
DBMS_OUTPUT.PUT_LINE('Number of messages dequeued: ' || retval);
END;/
10.7 通知の登録
このプロシージャでは、メッセージ通知に使用する電子メール・アドレス、ユーザー定義PL/SQLプロシージャまたはHTTP URLを登録します。
DBMS_AQ.REGISTER( reg_list IN SYS.AQ$_REG_INFO_LIST, reg_count IN NUMBER);
注意:
12cリリース2 (12.2)以降では、ユーザーが生成するキュー名の最大長は122バイトです。「キューの作成」を参照してください。
reg_listパラメータは、SYS.AQ$_REG_INFOオブジェクトのリストです。通知のサービス品質は、SYS.AQ$_REG_INFOのqosflags属性を使用して指定できます。
reg_countパラメータでは、reg_listのエントリ数を指定します。各サブスクリプションには固有のreg_listエントリが必要です。一度に、複数のサブスクリプションを登録できます。
PL/SQL通知の受信時には、コールバックの起動に使用されるOracle Database Advanced Queuingメッセージ・プロパティ記述子に通知メッセージのdelivery_modeがDBMS_AQ.PERSISTENTまたはDBMS_AQ.BUFFEREDとして指定されます。
電子メールによる通知を登録する場合は、データベースで電子メール通知の送信に使用されるSMTPサーバーのホスト名およびポート名を設定する必要があります。必要な場合は、データベースのsentfromフィールドを使用して、発信元の電子メール・アドレスを設定します。この機能を使用するには、Java対応のデータベースが必要です。
HTTP通知を登録した場合は、データベースでHTTP通知の転送に使用されるプロキシ・サーバーのホスト名とポート番号、および非プロキシ・ドメインのリストを設定できます。
ジョブ・キュー・プロセスにより処理される通知は、内部キューSYS.AQ_SRVNTFN_TABLE_Qに格納されます。通知に失敗すると、Oracle Database Advanced Queuingは失敗した通知を最大でMAX_RETRIES回まで再試行します。
注意:
SYS.AQ_SRVNTFN_TABLE_QのMAX_RETRIESおよびRETRY_DELAYプロパティは変更できます。新規の設定はすべての通知に適用されます。
関連項目:
-
SYS.AQ$_REG_INFOオブジェクトの詳細は、「AQ登録情報型」を参照してください。 -
メッセージ・プロパティ記述子の詳細は、「AQ通知記述子型」を参照してください。
例10-21 通知の登録
DECLARE
reginfo sys.aq$_reg_info;
reg_list sys.aq$_reg_info_list;
BEGIN
reginfo := sys.aq$_reg_info(
'test.obj_queue',
DBMS_AQ.NAMESPACE_ANONYMOUS,
'http://www.company.com:8080',
HEXTORAW('FF'));
reg_list := sys.aq$_reg_info_list(reginfo);
DBMS_AQ.REGISTER(
reg_list => reg_list,
reg_count => 1);
COMMIT;
END;
/
10.8 通知の登録解除
このプロシージャでは、メッセージ通知に使用する電子メール・アドレス、ユーザー定義PL/SQLプロシージャまたはHTTP URLの登録を解除します。
DBMS_AQ.UNREGISTER( reg_list IN SYS.AQ$_REG_INFO_LIST, reg_count IN NUMBER);
10.9 サブスクライバの通知の転送
このプロシージャでは、匿名サブスクリプションのリストに通知を転送し、サブスクリプションに登録する全クライアントが永続メッセージの通知を取得できるようにします。
DBMS_AQ.POST( post_list IN SYS.AQ$_POST_INFO_LIST, post_count IN NUMBER);
この機能は、バッファ済メッセージについてはサポートされません。
countパラメータでは、post_listのエントリ数を指定します。転送済の各サブスクリプションは、post_list内に固有のエントリを持つ必要があります。一度に、複数のサブスクリプションを転送できます。
post_listパラメータでは、転送する匿名サブスクリプションのリストを指定します。次の3つの属性があります。
-
name属性では、転送する匿名サブスクリプションの名前を指定します。 -
namespace属性では、サブスクリプションの名前空間を指定します。DBMS_AQ.POSTを介して他のアプリケーションから通知を受信するには、namespaceをDBMS_AQ.NAMESPACE_ANONYMOUSに設定する必要があります。 -
payload属性では、匿名サブスクリプションに転送するペイロードを指定します。このコールに関連付けるペイロードがない可能性もあります。
このコールは、最も効果的な転送を保証します。通知は、登録されたクライアントに対して最大で1回行われます。このコールは、主に軽量な通知に使用されます。アプリケーションがより確実な保証を必要とする場合は、キューにエンキューできます。
例10-22 オブジェクト型メッセージの転送
DECLARE
postinfo sys.aq$_post_info;
post_list sys.aq$_post_info_list;
BEGIN
postinfo := sys.aq$_post_info('test.obj_queue',0,HEXTORAW('FF'));
post_list := sys.aq$_post_info_list(postinfo);
DBMS_AQ.POST(
post_list => post_list,
post_count => 1);
COMMIT;
END;
/10.10 エージェントのLDAPサーバーへの追加
このプロシージャは、LDAPサーバーにOracle Databaseアドバンスト・キューイング・エージェントのエントリを作成します。
DBMS_AQ.BIND_AGENT( agent IN SYS.AQ$_AGENT, certificate IN VARCHAR2 default NULL);
agentパラメータは、Lightweight Directory Access Protocol (LDAP)サーバーに登録されるOracle Database Advanced Queuingエージェントを指定します。
certificateパラメータでは、このエージェントにデジタル証明書(usercertificate属性)を使用するLDAP内のOrganizationalPersonエントリの位置(LDAP識別名)を指定します。たとえば、cn=OE, cn=ACME, cn=comは、指定のエージェントに証明書を使用するOrganizationalPerson OEの識別名です。エージェントがデジタル証明を持たない場合、このパラメータはデフォルトでNULLに設定されます。
関連項目: