この章では、Oracle Streams Advanced Queuing(AQ)のPL/SQL操作インタフェースについて説明します。
内容は次のとおりです。
関連項目:
|
保護キューの場合は、messages_properties
パラメータにsender_id
を指定する必要があります。sender_id
の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のMESSAGE_PROPERTIES_T型に関する項を参照してください。
保護キューを使用する場合の要件は、次のとおりです。
DBMS_AQADM.CREATE_AQ_AGENT
を使用して、有効なOracle Streams AQエージェントを作成しておきます。
sender_id
を、保護キューに対してエンキュー権限があるデータベース・ユーザーにマップします。これには、DBMS_AQADM.ENABLE_DB_ACCESS
を使用します。
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 Streams AQでは、ペイロード・リポジトリとしてLOB
列を持つキュー表が作成されます。ペイロードの最大サイズは、Oracle Streams AQへのアクセスに使用するプログラム・インタフェースによって決まります。PL/SQL、Javaおよびプリコンパイラの場合は32KB、OCIの場合は4GBに制限されます。
メッセージが受信者を指定しないでマルチ・コンシューマ・キューにエンキューされ、そのキューにサブスクライバが指定されていない(またはそのメッセージに一致するルールベースのサブスクライバが存在しない)場合、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 Streams AQ 10gリリース1(10.1)より前のリリースでは、message_grouping がTRANSACTIONAL に設定されている場合、sequence_deviation 属性は無効です。
順序逸脱機能は、Oracle Streams AQ 10gリリース2(10.2)では廃止されました。 |
transformation
transformation
属性では、メッセージのエンキュー前に適用する変換を指定します。変換ファンクションの戻り型は、キューの型と一致する必要があります。
delivery_mode
属性のデフォルトはPERSISTENT
で、メッセージは永続メッセージとしてエンキューされます。BUFFERED
に設定すると、メッセージはバッファ済メッセージとしてエンキューされます。NULL値は設定できません。
message_properties
パラメータには、Oracle Streams AQでメッセージを個別に管理するために使用される情報が含まれます。属性は次のとおりです。
priority
属性では、メッセージの優先順位を指定します。優先順位には、負の数を含むすべての数値を指定できます。数値が小さいほど、優先順位が高いことを表します。
delay
属性では、メッセージがWAITING
状態になっている秒数を指定します。この秒数をすぎると、メッセージはREADY
状態になり、デキュー可能になります。NO_DELAY
を指定すると、メッセージは即時にデキュー可能になります。msgid
を指定してデキューすると、delay
指定がオーバーライドされます。
注意: バッファ済メッセージではdelayはサポートされません。 |
expiration
属性では、メッセージがREADY
状態になった後でデキュー可能な秒数を指定します。期限切れになる前にデキューされない場合、メッセージはEXPIRED
状態で例外キューに移されます。NEVER
を指定すると、メッセージは期限切れになりません。
注意: メッセージの遅延および期限切れの処理は、キュー・モニター(QMN )のバックグラウンド・プロセスによって行われます。Oracle Streams AQの遅延および期限切れの機能を使用するときは、データベースのQMNプロセスを開始する必要があります。
|
correlation
属性は、エンキュー時にメッセージのプロデューサが指定する識別子です。
attempts
属性は、メッセージをデキューするために実行された試行回数を指定します。このパラメータは、エンキュー時には設定できません。
recipient_list
パラメータは、マルチ・コンシューマに対応するキューにのみ有効です。デフォルトの受信者はキューのサブスクライバです。
exception_queue
属性では、正常に処理できない場合にメッセージが移されるキューの名前を指定します。メッセージの移動時に指定された例外キューが存在しない場合、メッセージはキュー表に対応付けられたデフォルトの例外キューに移され、アラート・ログに警告が記録されます。
エンキュー時にメッセージ・プロパティで指定したdelivery_mode
の値は無視されます。エンキュー・オプションで指定した値を使用して、メッセージの配信モードが設定されます。エンキュー・オプションで配信モードを指定しなければ、デフォルトでPERSISTENTに設定されます。
enqueue_time
属性では、メッセージがエンキューされた時刻を指定します。この値はシステムにより決定され、ユーザーはエンキュー時に設定できません。
注意: システム・クロックの季節変動情報(標準時と夏時間の間の切替えなど)は各キュー表とともに格納されるため、季節変動は自動的にenqueue_time に反映されます。他のなんらかの理由でシステム・クロックに変更があった場合は、Oracle Streams AQ用のデータベースを再起動して変更後の時刻を取得する必要があります。
|
state
属性では、デキュー時のメッセージの状態を指定します。このパラメータは、エンキュー時には設定できません。
sender_id
属性は、メッセージ・プロデューサがエンキュー時に指定したaq$_agent
型の識別子です。
original_msgid属性は、Oracle Streams AQでメッセージの伝播に使用されます。
transaction_group
属性では、メッセージのトランザクション・グループを指定します。この属性は、DBMS_AQ.DEQUEUE_ARRAY
でのみ設定されます。DBMS_AQ.ENQUEUE
またはDBMS_AQ.ENQUEUE_ARRAY
を介してメッセージのトランザクション・グループを設定する場合、この属性は使用できません。
user_property
属性はオプションです。ペイロードの詳細情報を格納するために使用されます。
この章の例には、第8章「Oracle Streams AQ管理インタフェース」の例と同じユーザー、メッセージ型、キュー表およびキューを使用しています。まだこれらの構造をテスト環境で作成していない場合は、次の例を実行する必要があります。
例8-1では、管理権限を持つユーザーとして接続する必要があります。前述のリストの他の例では、ユーザーtest_adm
として接続できます。キューの作成後に、「キューの開始」に示すようにキューを開始する必要があります。特に明記しないかぎり、この章に示すすべての例は通常のキュー・ユーザー'test'
として接続して実行できます。
例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; /
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-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-5では、6つのメッセージをtest.obj_queue
にエンキューしています。これらのメッセージは、例10-17でデキューされます。
例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では、ユーザー'test_adm'
として接続し、キューtest.multiconsumer_queue
にサブスクライバRED
およびGREEN
を追加する必要があります。この2つのサブスクライバは例10-7で必要になります。
例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では、送信者001からの複数のメッセージをエンキューします。MESSAGE 1はすべてのキュー・サブスクライバを対象としています。MESSAGE 2はREDおよびBLUEを対象としています。これらのメッセージは、例10-17でデキューされます。
例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では、3つのメッセージ・グループをエンキューします。各グループには、それぞれ3つのメッセージが含まれています。これらのメッセージは、例10-16でデキューされます。
例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のアプリケーションでは、メッセージは現時点の1週間前から3週間後までの期間内にデキューされる必要があります。期限切れは最も早いデキュー時刻から計算されるため、この場合は期限切れを2週間に設定する必要があります。
例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; /
関連項目: OO4Oのメッセージ・エンキューの例は、『Oracle Objects for OLE開発者ガイド』のアドバンスト・キューイング・インタフェースの使用に関する項を参照してください。 |
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;
ENQUEUE_ARRAY
関数を使用して、対応する配列のメッセージ・プロパティを使用するペイロードの配列をエンキューします。結果には、エンキューされたメッセージのメッセージ識別子の配列が出力されます。関数はエンキューに成功したメッセージの数を戻します。
バッファ済メッセージの場合、配列のエンキューはサポートされていませんが、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;/
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 はコールできません。
|
例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; /
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"
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);
このプロシージャでは、メッセージを指定のキューからデキューします。Oracle Streams AQ 10gリリース2(10.2)からは、デキュー対象として永続メッセージのみ、バッファ済メッセージのみ、またはその両方を選択できます。次に示すデキュー・オプションのリストのdelivery_mode
を参照してください。
dequeue_options
パラメータでは、デキュー操作に使用可能なオプションを指定します。属性は次のとおりです。
コンシューマは、DBMS_AQADM
.ADD_SUBSCRIBER
プロシージャのAQ$_AGENT
型またはメッセージ・プロパティの受信者リストに使用した名前を指定して、キューからメッセージをデキューできます。値を指定すると、consumer_name
と一致するメッセージのみがアクセスされます。キューがマルチ・コンシューマ用に設定されていない場合は、このフィールドをNULL(デフォルト)に設定する必要があります。
dequeue_mode
属性では、デキュー関連のロック動作を指定します。BROWSE
を指定すると、メッセージはロックを取得せずにデキューされます。LOCKED
を指定すると、メッセージはデキューされ、トランザクションの期間中は書込みロックが継続します。REMOVE
を指定すると、メッセージはデキューされて削除されます(デフォルト)。メッセージは、retentionプロパティに基づいて、キュー表に保存できます。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 Streams AQでは解釈されない、アプリケーション定義の識別子です。パーセント記号やアンダースコアなど、特殊なパターン・マッチング文字を使用できます。複数のメッセージがパターンと一致する場合、デキュー順序は不定になり、キューのソート順序は無視されます。
注意: バッファ済メッセージの場合、デキュー・オプション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
コールでは参照できません。
コミット時キューはOracle Streams AQ 10gリリース2(10.2)の新機能であり、近似CSCNに基づいて確定的な順序を確立できないかぎり、BROWSE
またはDEQUEUE
のコールではメッセージを参照できません。
dequeue_conditions
パラメータのnavigation
属性がNEXT
_MESSAGE
(デフォルト)の場合、後続のデキューでは、最初のデキューで取得したスナップショットを基にするキューからメッセージが取り出されます。したがって、最初のデキュー・コマンド以降にエンキューされたメッセージは、キューに残っているメッセージがすべて処理された後にのみ処理されます。すべてのメッセージがエンキュー済の場合、またはキューに優先順位ベースの順序が設定されていない場合、これは問題ではありません。ただし、アプリケーションでキューにある最も優先順位の高いメッセージを処理する必要がある場合は、FIRST_MESSAGE
ナビゲーション・オプションを使用する必要があります。
注意: 同時にエンキューされるメッセージがある場合には、FIRST_MESSAGE ナビゲーション・オプションを使用すると効率的です。FIRST_MESSAGE オプションを指定しないと、Oracle Streams AQでは最初のデキュー・コマンドと同様のスナップショットが継続的に生成されるため、パフォーマンスの低下につながります。FIRST_MESSAGE オプションを指定すると、Oracle Streams AQでは、すべてのデキュー・コマンドに新規のスナップショットが使用されます。
|
メッセージをグループ化できるキューに同一トランザクションのメッセージがエンキューされると、グループが形成されます。トランザクションに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
例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; /
LOB型メッセージのデキュー
例10-14では、例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-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-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-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を実行すると、例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-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では、例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-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では、例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-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; /
関連項目: OO4Oのメッセージ・デキューの例は、『Oracle Objects for OLE開発者ガイド』のアドバンスト・キューイング・インタフェースの使用に関する項を参照してください。 |
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;
DEQUEUE_ARRAY
関数を使用して、ペイロードの配列および対応する配列のメッセージ・プロパティをデキューします。結果には、デキューされたメッセージのペイロードの配列、メッセージ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
でも使用できます。Oracle Streams AQ 10gリリース2(10.2)からは、デキュー対象として永続メッセージのみ、バッファ済メッセージのみ、またはその両方を選択できます。また、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;/
DBMS_AQ.REGISTER( reg_list IN SYS.AQ$_REG_INFO_LIST, reg_count IN NUMBER);
このプロシージャでは、メッセージ通知に使用する電子メール・アドレス、ユーザー定義PL/SQLプロシージャまたはHTTP URLを登録します。
注意: Oracle Database 10gリリース2(10.2)より前のリリースでは、31文字以上の名前を持つキューの場合、Oracle Streams AQの通知機能はサポートされませんでした。この制限は適用されなくなりました。ユーザー生成キューの名前には、引き続き24文字という制限が適用されます。「キューの作成」を参照してください。 |
reg_list
パラメータは、SYS.AQ$_REG_INFO
オブジェクトのリストです。SYS.AQ$_REG_INFO
のqosflags
属性を使用すると、サービスの通知品質を指定できます。これはOracle Streams AQ 10gリリース2(10.2)の新機能です。
reg_count
パラメータでは、reg_list
のエントリ数を指定します。各サブスクリプションには固有のreg_list
エントリが必要です。一度に、複数のサブスクリプションを登録できます。
PL/SQL通知の受信時には、コールバックの起動に使用されるOracle Streams AQメッセージ・プロパティ記述子に通知メッセージのdelivery_mode
がDBMS_AQ.PERSISTENT
またはDBMS_AQ.BUFFERED
として指定されます。
電子メール通知を登録した後、データベースで電子メール通知の送信に使用するSMTPサーバーのホスト名とポート名を設定する必要があります。必要な場合は、送信元の電子メール・アドレスを設定します。このアドレスは、データベースによりsent from
フィールドとして設定されます。この機能を使用するには、Java対応データベースが必要です。
HTTP通知を登録した場合は、データベースでHTTP通知の転送に使用されるプロキシ・サーバーのホスト名とポート番号、および非プロキシ・ドメインのリストを設定できます。
ジョブ・キュー・プロセスにより処理される通知は、内部キューSYS.AQ_SRVNTFN_TABLE_Q
に格納されます。通知に失敗すると、Oracle Streams AQは失敗した通知を最大でMAX_RETRIES
回まで再試行します。
注意: SYS.AQ_SRVNTFN_TABLE_Q のMAX_RETRIES およびRETRY_DELAY プロパティは変更できます。新規の設定はすべての通知に適用されます。
|
例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; /
DBMS_AQ.UNREGISTER( reg_list IN SYS.AQ$_REG_INFO_LIST, reg_count IN NUMBER);
このプロシージャでは、メッセージ通知に使用する電子メール・アドレス、ユーザー定義PL/SQLプロシージャまたはHTTP URLの登録を解除します。
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
属性では、匿名サブスクリプションに転送するペイロードを指定します。このコールにペイロードを対応付けなくてもかまいません。
このコールは、最も効果的な転送を保証します。通知は、登録されたクライアントにすぐに届きます。このコールは、主に軽量な通知に使用されます。アプリケーションがより確実な保証を必要とする場合は、キューにエンキューできます。
DBMS_AQ.BIND_AGENT( agent IN SYS.AQ$_AGENT, certificate IN VARCHAR2 default NULL);
このプロシージャは、Lightweight Directory Access Protocol(LDAP)サーバーにOracle Streams AQエージェントのエントリを作成します。
agent
パラメータでは、LDAPサーバーに登録するOracle Streams AQエージェントを指定します。
certificate
パラメータでは、このエージェントにデジタル証明書(usercertificate
属性)を使用するLDAP内のOrganizationalPerson
エントリの位置(LDAP識別名)を指定します。たとえば、cn=OE, cn=ACME, cn=com
は、指定のエージェントに証明書を使用するOrganizationalPerson
OE
の識別名です。エージェントがデジタル証明を持たない場合、このパラメータはデフォルトでNULLに設定されます。