Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  4/2008  Pfeil  Datenbanken
suche: 
Dieser Artikel wendet sich an Datenbankadministratoren und Entwickler, die einen Überblick über die Objekttypen von Oracle bekommen möchten.

Glossar

Advanced Queuing (AQ)
AQ ist ein Messaging-Mechanismus in einer Datenbank.
Enqueue
Einstellen von Nachrichten in eine Queue.
Dequeue
Entnahme einer Nachricht aus einer Queue.


Reihe Oracle Objekttypen von A - Z (Teil VIII):

Queue - Advanced Queuing

Im achten Teil der Reihe Objekttypen fahren wir mit dem Buchstaben "Q" wie Queue fort. Augenmerk legen wir hier auf das Advanced Queuing. Eine vollständige Beschreibung aller Möglichkeiten würde den Rahmen dieses Artikels sprengen. Deshalb wird hier lediglich das Prinzip der Implementierung vorgestellt.

Oracle Advanced Queuing

Advanced Queuing (AQ) ist ein Messaging-System in Oracle Datenbanken. Es ermöglicht den Datenaustausch zwischen verschiedenen Applikationen. Die Vorteile der Datenbankunterstützung zeichnen sich durch Hochverfügbarkeit, Sicherheit, Flexibilität und der Möglichkeit zur Datenrettung aus.

ALTER SYSTEM SET AQ_TM_PROCESSES=1 SCOPE=BOTH;
Abb. 1: Initialisierungsparameter AQ_TM_PROCESSES.
CREATE TYPE my_aq_type AS OBJECT(
  no     NUMBER,
  title  VARCHAR2(30),
  text   VARCHAR2(200));
Abb. 2: Estellen eines Payload-Objekts.
DBMS_AQADM.CREATE_QUEUE_TABLE(
  queue_table        => 'MY_AQ_TABLE',
  queue_payload_type => 'MY_AQ_TYPE'
);
Abb. 3: Erstellen einer Queue-Tabelle.
DBMS_AQADM.CREATE_QUEUE(
  queue_name  => 'MY_AQ_QUEUE',
  queue_table => 'MY_AQ_TABLE'
);
Abb. 4: Erstellen einer Queue.
DBMS_AQADM.START_QUEUE(
  queue_name => 'MY_AQ_QUEUE'
);
Abb. 5: Starten einer Queue.
DECLARE
  enqueue_options     dbms_aq.enqueue_options_t;
  dequeue_options     dbms_aq.dequeue_options_t;
  message_properties  dbms_aq.message_properties_t;
  message_id          RAW(16);
  my_message          my_aq_type;
BEGIN
  my_message := my_aq_type (
   1,
   'First run',
   'Date: '||TO_CHAR(SYSDATE, 'DD.MM.YYYY')
  );

  dbms_aq.enqueue(
    queue_name => 'MY_AQ_QUEUE',
    enqueue_options => enqueue_options,
    message_properties => message_properties,
    payload => my_message,
    msgid => message_id);

  dbms_aq.dequeue(
    queue_name => 'MY_AQ_QUEUE',
    dequeue_options => dequeue_options,
    message_properties => message_properties,
    payload => my_message,
    msgid => message_id);

  COMMIT;

  dbms_output.put_line('Number: '||my_message.no);
  dbms_output.put_line('Title: '||my_message.title);
  dbms_output.put_line('Text: '||my_message.text);
END;
Abb. 6: Beispiel von Enqueue und Dequeue einer Singleconsumer Queue.
SELECT    object_name, object_type
FROM      all_objects
WHERE     object_name LIKE '%MY_AQ%';

OBJECT_NAME                    OBJECT_TYPE         
------------------------------ ------------------- 
MY_AQ_TYPE                     TYPE                
MY_AQ_TABLE                    TABLE               
AQ$_MY_AQ_TABLE_T              INDEX               
AQ$_MY_AQ_TABLE_I              INDEX               
AQ$_MY_AQ_TABLE_E              QUEUE               
AQ$_MY_AQ_TABLE_F              VIEW                
AQ$MY_AQ_TABLE                 VIEW                
MY_AQ_QUEUE                    QUEUE
Abb. 7: Selektion von erstellten AQ-Objekten.

Nachrichten werden in einer so genannten Warteschlange (= Queue) abgelegt. Die Datenbasis dieser Warteschlange ist eine Tabelle, in der jede Zeile eine Nachricht repräsentiert.

Queue-Tabellen können mit verschiedenen Datentypen und somit Dateninhalten angelegt und dadurch an den Nachrichtenaustausch von Applikationen angepasst werden.

Zu jeder Queue-Tabelle wird automatisch eine Exception Queue angelegt. Treten bei Weiterleitungen von Nachrichten Probleme auf oder ist die benutzerdefinierte Gültigkeitsdauer der Nachrichten überschritten, werden diese in die Exception Queue verschoben.

Arten von Queues

Es gibt zwei Arten von Queues:

Datenbankumgebung einstellen

Um Advanced Queuing in der Datenbank zu nutzen, muss mindestens ein Queue-Monitor-Prozess aktiv sein. Dieser Queue-Monitor-Prozess prüft beispielsweise nach, ob Nachrichten bereits an alle Empfänger gesendet worden sind und ob und wie lange diese nach vollständiger Bearbeitung aus der Queue entfernt werden (= rentention time).

Hierzu sollte der Initialisierungsparameter AQ_TM_PROCESSES auf einen Wert > 0 eingestellt werden (bis Oracle 10g). Bei einem Wert von beispielsweise 10, werden mindestens ein und maximal zehn Prozesse gestartet. Die Anzahl der aktiven Prozesse richtet sich nach dem Arbeitsaufkommen zum Abarbeiten der Queues.

Die Änderung des Parameters kann auch im laufenden Betrieb vorgenommen werden (siehe Abbildung 1).

Berechtigungen

Die Implementierung von Advanced Queuing setzt bestimmte Berechtigungen voraus. In der Regel wird ein AQ-Administrator mit den benötigten Rechten angelegt. Dieser Administrator dient gleichzeitig als Eigentümer aller erstellten AQ-Objekte. Weiterhin können AQ-Nutzer angelegt oder bestehende mit den benötigten Rechten ausgestattet werden.

Um das Vergeben der Rechte an andere AQ-Nutzer zu erleichtern, ist es sinnvoll, eigene Rollen für die Nutzung bzw. Verwaltung der AQ-Architektur anzulegen. Oracle bietet bereits zwei vorgefertigte Rollen zum Advanced Queuing an:

Implementierung

Um Nachrichten über Advanced Queuing austauschen zu können, sind folgende Schritte notwendig:

Eine Queue-Tabelle wird mit Hilfe des Packages DBMS_AQADM angelegt. Standardmäßig sind alle Queues Singleconsumer, sprich: genau ein Empfänger kann eine Nachricht verarbeiten. Der Empfänger braucht sich hierbei nicht auszuweisen.

Über den Parameter MULTIPLE_CONSUMERS der Prozedur CREATE_QUEUE_TABLE kann eine Multiconsumer Queue angelegt werden.

Hier können die Empfänger implizit als so genannte Teilnehmer (= Subscriber) ausgewiesen, oder explizit beim dem Versenden einer Nachricht als Empfänger (= Recipient) angegeben werden. In diesem Fall können einige Subscriber die Nachricht nicht erhalten.

Jede Nachricht trägt Nutzdaten (= Payload) mit sich. Diese Nutzdaten können sowohl Basisdatentypen wie NUMBER und VARCHAR2 als auch Objekttypen sein. In Abbildung 2 wird für die Nutzlast ein Objekttyp verwendet.

Mit Hilfe dieses Objekttyps wird eine Queue-Tabelle erstellt. Hierzu wird die Prozedur CREATE_QUEUE_TABLE aus dem Package DBMS_AQADM mit den nötigen Parametern aufgerufen. Der Parameter QUEUE_TABLE gibt den Namen der zu erstellenden Queue-Tabelle an. QUEUE_PAYLOAD_TYPE erwartet die Angabe eines Typs für die Nutzdaten, in dem Fall MY_AQ_TYPE (siehe Abbildung 3).

Wurde die Queue-Tabelle erstellt, kann nun eine Queue erzeugt werden. Der Prozedur CREATE_QUEUE werden die Parameter QUEUE_NAME und QUEUE_TABLE übergeben (siehe Abbildung 4).

Um die Queue nutzen zu können, wird sie mit Hilfe der Prozedur START_QUEUE in Betrieb genommen. Hier reicht die Angabe der zu startenden Queue im Parameter QUEUE_NAME (siehe Abbildung 5).

Sind alle Schritte erfolgreich verlaufen, kann die Queue nun genutzt werden. Das Beispiel in Abbildung 6 zeigt eine einfache Verwendung von Nachrichten Einreihung (= Enqueue) und die Entnahme von Nachrichten (= Dequeue). Für Enqueue und Dequeue wird kein implizites COMMIT gesetzt. Dies muss explizit in der Programmierung beachtet werden.

Datenbankobjekte

Eine einfache Selektion (siehe Abbildung 7) auf den Data-Dictionary View ALL_OBJECTS, gibt einen Überblick der erstellten Datenbankobjekte.

Fazit

Oracle Advanced Queuing ist ein mächtiges Werkzeug für den Umgang mit Queues. Bei komplexen Projekten oder sei es allein nur für die Kommunikation zwischen zwei Applikationen, gewinnt Advanced Queuing immer mehr an Bedeutung.

Hier kann die gesamte Bandbreite der Funktionalität von Advanced Queuing in Betracht gezogen werden. Die von Oracle zur Verfügung gestellte Java-Bibliothek zum Advanced Queuing gibt zusätzliche Freiheit zur unabhängigen Applikationsentwicklung.

Karsten Fiedler (info@ordix.de).