日本語PDF

2 Oracle Database Advanced Queuingの基本コンポーネント

このトピックでは、Oracle Database Advanced Queuingの基本コンポーネントを示します。

オブジェクト名

このコンポーネントは、データベース・オブジェクトに名前を付けます。

object_name := VARCHAR2
object_name := [schema_name.]name

このネーミング規則は、キュー、キュー表およびオブジェクト型に適用されます。

オブジェクト名は、オプションのスキーマ名および名前で指定します。スキーマ名を指定しない場合は、現行のスキーマが想定されます。名前は、『Oracle Database SQL言語リファレンス』『Oracle Database SQL言語リファレンス』にある予約語のガイドラインに従って指定する必要があります。スキーマ名、エージェント名およびオブジェクト型の名前はそれぞれ128バイト以下である必要があります。一方、12cリリース2 (12.2)以降では、キュー名およびキュー表名は、最大122バイトで指定できます。

タイプ名

このコンポーネントでは、キュー・タイプを定義します。

type_name := VARCHAR2
type_name := object_type | "RAW"

オブジェクト型の属性数は最大で900です。

RAW型のペイロードを格納するために、Oracle Database Advanced Queuingでは、ペイロード・リポジトリとしてLOB列を持つキュー表が作成されます。ペイロードのサイズは、32KB以下のデータにする必要があります。LOB列はRAWペイロードの格納に使用されるため、Oracle Databaseアドバンスト・キューイング管理者は、LOB表領域を選択して、キュー表作成時にstorage_clauseパラメータにLOB記憶域文字列を設定すると、LOB記憶域を構成できます。

注意:

LOBを含むペイロードの場合、エンキューおよびデキュー操作を実行するには、キュー表に対する明示的なSelectInsertおよびUpdate権限を付与する必要があります。

AQエージェント型

このコンポーネントでは、メッセージのプロデューサまたはコンシューマを識別します。

TYPE AQ$_AGENT IS OBJECT (
   name            VARCHAR2(30), 
   address         VARCHAR2(1024),
   protocol        NUMBER);

マルチ・コンシューマ・キューにサブスクライバとして追加されたすべてのコンシューマは、AQ$_AGENTパラメータに一意の値を持つ必要があります。2つのサブスクライバがAQ$_AGENT型のNAME属性、ADDRESS属性およびPROTOCOL属性に同じ値を持つことはできません。この3つの属性のうち少なくとも1つは、2つのサブスクライバに対して異なる値にする必要があります。

多くのサブスクライバを追加するには、DBMS_AQADM.ADD_SUBSCRIBERプロシージャを繰り返し使用することで、1つのマルチ・コンシューマ・キュー当たり最大1024サブスクライバを追加できます。

この型は次の3つの属性を持ちます。

  • name

    この属性は、メッセージプロデューサまたはコンシューマの名前を指定します。アプリケーション名か、アプリケーションによって割り当てられた名前のいずれかです。キュー自体が、別のキューからエンキューまたはデキューしているエージェントでも可能です。名前は、『Oracle Database SQL言語リファレンス』にある予約語のガイドラインに従って指定する必要があります。

  • address

    この属性はprotocolのコンテキストで解析されます。protocolが0(デフォルト)の場合、address[schema.]queue[@dblink]形式です。

  • protocol

    この属性では、アドレスを解析してメッセージを伝播するプロトコルを指定します。デフォルト値は0 (ゼロ)です。

AQ受信者リスト型

このコンポーネントでは、メッセージを受信するエージェントのリストを識別します。

TYPE AQ$_RECIPIENT_LIST_T IS TABLE OF aq$_agent
           INDEX BY BINARY_INTEGER;
 

AQエージェント・リスト型

このコンポーネントでは、DBMS_AQ.LISTENをリスニングするエージェントのリストを識別します。

TYPE AQ$_AGENT_LIST_T IS TABLE OF aq$_agent 
           INDEX BY BINARY INTEGER; 

AQサブスクライバ・リスト型

このコンポーネントでは、このキューをサブスクライブするサブスクライバのリストを識別します。

TYPE AQ$_SUBSCRIBER_LIST_T IS TABLE OF aq$_agent
          INDEX BY BINARY INTEGER;

AQ登録情報リスト型

このコンポーネントでは、キューへの登録リストを識別します。

TYPE AQ$_REG_INFO_LIST AS VARRAY(1024) OF sys.aq$_reg_info;

AQ転送情報リスト型

このコンポーネントでは、メッセージが転送される匿名サブスクリプションのリストを識別します。

TYPE AQ$_POST_INFO_LIST AS VARRAY(1024) OF sys.aq$_post_info;

AQ登録情報型

このコンポーネントでは、メッセージのプロデューサまたはコンシューマを識別します。

TYPE SYS.AQ$_REG_INFO IS OBJECT (
   name                              VARCHAR2(128),
   namespace                         NUMBER,
   callback                          VARCHAR2(4000),
   context                           RAW(2000)  DEFAULT NULL,
   qosflags                          NUMBER,
   timeout                           NUMBER
   ntfn_grouping_class               NUMBER,
   ntfn_grouping_value               NUMBER    DEFAULT 600,
   ntfn_grouping_type                NUMBER,
   ntfn_grouping_start_time          TIMESTAMP WITH TIME ZONE,
   ntfn_grouping_repeat_count   NUMBER);

このコンポーネントの属性は、次のとおりです。

表2-1 AQ$_REG_INFO型属性

属性 説明

name

サブスクリプション名を指定します。単一コンシューマ・キューの登録の場合はschema.queue形式のサブスクリプション名、マルチ・コンシューマ・キューの登録の場合はschema.queue:consumer_name形式の名前となります。

namespace

サブスクリプションのネームスペースを指定します。Oracle Database AQキューから通知を受信するには、namespaceをDBMS_AQ.NAMESPACE_AQに設定する必要があります。DBMS_AQ.POSTまたはOCISubscriptionPost()を介して他のアプリケーションから通知を受信するには、namespaceをDBMS_AQ.NAMESPACE_ANONYMOUSに設定する必要があります。

callback

メッセージ通知時に実行されるアクションを指定します。HTTP通知の場合、http://www.company.com:8080を使用します。電子メール通知の場合、mailto://xyz@company.comを使用します。PLSQLCALLBACKプロシージャに対するRAWメッセージ・ペイロードの場合は、plsql://schema.procedure?PR=0を指定します。PLSQLCALLBACKプロシージャに対するXML変換済のユーザー定義タイプ・メッセージ・ペイロードの場合は、plsql://schema.procedure?PR=1を指定します。

context

コールバック関数に渡すコンテキストを指定します。

qosflags

次の1つ以上の値に設定して、サービスの通知品質を指定できます。

  • NTFN_QOS_RELIABLE: この値は、信頼できる通知が必要であることを示します。信頼できる通知がインスタンス間で存続し、データベースが再起動します。

  • NTFN_QOS_PAYLOAD - この値は、ペイロード配信が必要であることを指定します。これは、クライアント通知およびRAWキューに対してのみサポートされます。

  • NTFN_QOS_PURGE_ON_NTFN - この値は、この登録位置に最初の通知が配信されると、登録が自動的にパージされるように指定します。

ntfn_grouping_class

グループ化の基準を指定するために現在設定できるのは、次のフラグのみです。デフォルト値は0(ゼロ)です。ntfn_grouping_classが0(ゼロ)の場合、他のすべての通知グループ属性は0(ゼロ)である必要があります。

  • NTFN_GROUPING_CLASS_TIME - 通知が時間別にグループ化されます。ユーザーが時間の値を指定すると、時間の終了時に通知がパブリッシュされます。

ntfn_grouping_value

グループ化通知の周期を秒で指定します。ntfn_grouping_repeat_countが使い果されるまで、グループ化通知が周期的に送信される時間を表します。

ntfn_grouping_type

  • NTFN_GROUPING_TYPE_SUMMARY - 間隔内で発生したすべての通知のサマリー。(デフォルト)

  • NTFN_GROUPING_TYPE_LAST - 間隔内で発生した最後の通知。

ntfn_grouping_start_time

通知のグループ化の開始時間。通知のグループ化は、ユーザーが指定した時間に開始できますが、この時間はタイムゾーン付きの有効なタイムスタンプである必要があります。グループ化を使用する際にntfn_grouping_start_timeが指定されない場合、デフォルトでタイムゾーンの現在のタイムスタンプに設定されます。

ntfn_grouping_repeat_count

グループ化の通知が通知のグループ化の繰返し件数で指定した回数送信された後、通常の通知に戻ります。ntfn_grouping_repeat_countを指定しない場合、デフォルトで次のように設定されます。

  • NTFN_GROUPING_FOREVER - グループ化の通知を永久的に送信します。

AQ通知記述子型

このコンポーネントは、通知時にAQ PL/SQLのコールバックが受信するOracle Databaseアドバンスト・キューイングの記述子を指定します。

TYPE SYS.AQ$_DESCRIPTOR IS OBJECT (
   queue_name      VARCHAR2(61),
   consumer_name   VARCHAR2(30),
   msg_id          RAW(16),
   msg_prop        MSG_PROP_T,
   gen_desc        AQ$_NTFN_DESCRIPTOR,
   msgid_array     SYS.AQ$_NTFN_MSGID_ARRAY, 
   ntfnsRecdInGrp  NUMBER);

次の属性が含まれます。

表2-2 AQ$_DESCRIPTOR属性

属性 説明

queue_name

メッセージがエンキューされ、通知されたキューの名前を指定します。

consumer_name

マルチ・コンシューマ・キューのコンシューマの名前

msg_id

メッセージの指定番号

msg_prop

MSG_PROP_T型で指定されたメッセージ・プロパティ

gen_desc

タイムアウト指定を示します。

msgid_array

グループ化の通知のメッセージIDリスト

ntfnsRecdInGrp

グループで受信した通知

AQメッセージ・プロパティ型

メッセージ・プロパティ型msg_prop_tには、次のコンポーネントがあります。

TYPE AQ$_MSG_PROP_T IS OBJECT(
   priority         number,
   delay            number,
   expiration       number,
   correlation      varchar2(128),
   attempts         number,
   recipent_list    aq$_recipient_list_t,
   exception_queue  varchar2(51),
   enqueue_time     date,
   state            number,
   sender_id        aq$_agent,
   original_misgid  raw(16),
   delivery_mode    number);

タイムアウト指定型AQ$_NTFN_DESCRIPTORには、次の単一コンポーネントがあります。

TYPE AQ$_NTFN_DESCRIPTOR IS OBJECT(
   NTFN_FLAGS   number);

NTFN_FLAGSは、指定のタイムアウト後に通知が削除されている場合は1、それ以外の場合は0に設定されます。

AQ転送情報型

このコンポーネントでは、メッセージの転送先となる匿名サブスクリプションを指定します。

TYPE SYS.AQ$_POST_INFO IS OBJECT (
  name       VARCHAR2(128),
  namespace  NUMBER,
  payload    RAW(2000));

次の3つの属性があります。

  • name

    この属性では、転送する匿名サブスクリプションの名前を指定します。

  • namespace

    この属性では、匿名サブスクリプションの名前空間を指定します。DBMS_AQ.POSTまたはOCISubscriptionPost()を使用して他のアプリケーションから通知を受信するには、namespaceをDBMS_AQ.NAMESPACE_ANONYMOUSに設定する必要があります。

  • payload

    この属性では、匿名サブスクリプションに転送するペイロードを指定します。デフォルトはNULLです。

AQ$_NTFN_MSGID_ARRAYタイプ

このコンポーネントは、AQ名前空間のグループ化の通知データを、最大VARRYサイズ、値230で格納します。

TYPE SYS.AQ$_NTFN_MSGID_ARRAY AS VARRAY(1073741824)OF RAW(16);

AQ管理インタフェースの列挙定数

INFINITETRANSACTIONALNORMAL_QUEUEなどの列挙定数を値として選択する場合、定数はそれを定義するパッケージのスコープとともに指定する必要があります。

管理インタフェースに関連付けられているすべてのタイプには、DBMS_AQADMを付加する必要があります。次に例を示します。

DBMS_AQADM.NORMAL_QUEUE

表2-3は、Oracle Database Advanced Queuing管理インタフェースの列挙定数を示しています。

表2-3 Oracle Database Advanced Queuing管理インタフェースの列挙定数

パラメータ オプション

retention

0,1,2...INFINITE

message_grouping

TRANSACTIONALNONE

queue_type

NORMAL_QUEUEEXCEPTION_QUEUE、NON_PERSISTENT_QUEUE

delivery_mode

BUFFEREDPERSISTENTPERSISTENT_OR_BUFFERED

注意:

非永続キューは、Oracle Database Advanced Queuing 10gリリース2 (10.2)では非推奨です。かわりにバッファ済メッセージを使用することをお薦めします。

AQ操作インタフェースの列挙定数

BROWSELOCKEDREMOVEなどの列挙定数を使用する場合、PL/SQL定数はそれを定義するパッケージのスコープとともに指定する必要があります。

操作インタフェースに関連付ける型の前には、必ずDBMS_AQADMを付加します。次に例を示します。

DBMS_AQ.BROWSE

表2-4は、Oracle Database Advanced Queuing操作インタフェースの列挙定数を示しています。

表2-4 Oracle Database Advanced Queuing操作インタフェースの列挙定数

パラメータ オプション

visibility

IMMEDIATEON_COMMIT

dequeue mode

BROWSELOCKEDREMOVEREMOVE_NODATA

navigation

FIRST_MESSAGENEXT_MESSAGENEXT_TRANSACTION

state

WAITINGREADYPROCESSEDEXPIRED

wait

FOREVERNO_WAIT

delay

NO_DELAY

expiration

NEVER

namespace

NAMESPACE_AQNAMESPACE_ANONYMOUS

delivery_mode

BUFFEREDPERSISTENTPERSISTENT_OR_BUFFERED

quosflags

NTFN_QOS_RELIABLENTFN_QOS_PAYLOADNTFN_QOS_PURGE_ON_NTFN

ntfn_grouping_class

NFTN_GROUPING_CLASS_TIME

ntfn_grouping_type

NTFN_GROUPING_TYPE_SUMMARYNTFN_GROUPING_TYPE_LAST

ntfn_grouping_repeat_count

NTFN_GROUPING_FOREVER

AQバックグラウンド・プロセス

このトピックでは、Oracle Database Advanced Queuingのバックグラウンド・プロセスについて説明します。

キュー・モニター・プロセス

AQ_TM_PROCESSESパラメータは指定せず、システムの自動チューニングを利用することをお薦めします。

多数のOracle Database Advanced Queuingタスクが、バックグラウンドで実行されます。これには、READY状態に指定されたDELAYでのメッセージの変換、メッセージの期限切れ、例外キューへのメッセージの移動、バッファ済メッセージのオーバーフローおよびリカバリ、その他の類似する操作が含まれます。

Oracle Database AQを使用するときに、AQ_TM_PROCESSESを設定する必要はなくなりました。値が指定されている場合、その値がQxxプロセスの開始時に考慮されます。ただし、Qxxプロセスの数は、AQ_TM_PROCESSESで指定した値とは異なる場合があります。

バックグラウンド・プロセスを使用不可にするAPIと使用可能にするAPIを分離する必要はありません。その制御は、AQ_TM_PROCESSESをゼロまたはゼロ以外に設定することで行います。ただし、AQ_TM_PROCESSESパラメータは指定せず、システムの自動チューニングを利用することをお薦めします。

注意:

キュー・モニター・コーディネータを無効にするには、pfileまたはspfileAQ_TM_PROCESSES = 0を設定する必要があります。AQ_TM_PROCESSESパラメータはゼロ(0)に設定しないでください。

ジョブ・キュー・プロセス

伝播およびPL/SQL通知は、ジョブ・キュー(Jnnn)・プロセスによって処理されます。

JOB_QUEUE_PROCESSESパラメータを指定する必要はなくなりました。データベース・スケジューラが、伝播および通知ジョブに必要なジョブ・キュー・プロセスを自動的に開始します。

AQバックグラウンド・アーキテクチャ

Oracle Database Advanced Queuing 12cリリース1 (12.1)では、3層設計のAQバックグラウンド・アーキテクチャが新たに採用されています。

  • Tier1 (AQPC): アドバンスト・キューイング・プロセス・コーディネータと呼ばれる単一のバックグラウンド・プロセスがインスタンスの開始時に作成されます。これは、様々なマスター・プロセスの作成および管理を実行します。コーディネータ統計は、GV$AQ_BACKGROUND_COORDINATORを使用して表示できます。

  • Tier2 (QM**): キュー・モニターと呼ばれる多くのマスター・プロセスがあります。それぞれ、異なるタイプのジョブを処理します。ジョブのタイプには、通知(Emonプール)、キュー・モニター(シャード・キュー時間マネージャの処理)、クロス・プロセスなどがあります。

    注意:

    QMNCおよびEMNCなどの古いプロセスは、新しいマスター・プロセスのいずれかに含まれます。

    ジョブは、そのタスクを実行するために、複数のサーバー・プロセス(Q***)に渡る独自のスケジュール・メカニズムを必要とする作業タイプとして定義できます。マスター・プロセス統計およびそのジョブは、GV$AQ_JOB_COORDINATORを使用して表示できます。

  • Tier3(Q***): 前述のすべてのマスター・プロセスに対する単一のサーバー・プロセス・プールがあります。各プロセスは、一度に1つのマスター・プロセスに関連付けられます。ただし、元のマスターを使用する必要性がなくなった場合、別のマスターに再スケジュールできます。これらのサーバーにより、各マスターのジョブが実行され、パフォーマンスおよびスケーラビリティが向上します。サーバー・プロセス統計および現在のマスターの関連付けは、GV$AQ_SERVER_POOLを使用して表示できます。