Oracle
Advanced Queuing
Naresh Kumar Y
Agenda
Introduction
Environment setup
Packages to manage AQs
Payload
Queue table
Create Queue
Grant privileges
Message properties
Enqeue options
Enqueue message
Deqeue options
Dequeue message
Introduction
Exchanging messages and
communicating between two or more
different application modules
Environment setup
Administration and access privileges
for advanced queuing are controlled
using the below two roles
AQ_ADMINISTRATOR_ROLE - Allows
creation and administration of queuing
infrastructure.
AQ_USER_ROLE - Allows access to
queues for enqueue and dequeue
operations.
Packages to manage AQs
DBMS_AQADM - To perform below
Admin operations like creating
queue, queue tables, stop queue,
drop queue etc.
DBMS_AQ - To manage the Queues
like enqueue, dequeue etc.
Payload
AQ handles messages known as
payloads.
The format and structure of the
messages are designed by payload
Payload type can be either userdefined objects , xml type, ANYDATA,
RAW.
Queue table
Queue table store the queue information
We can create multiple queues for the
single queue table
Create queue table using the DBMS_AQ
package.
Example ::
DBMS_AQADM.create_queue_table
(queue_table
=>
'xx_event_queue_tbl',
queue_payload_type
=> 'customer_msg'
);
Create queue
Create and start queue using DBMS_AQ
package.
Example ::
DBMS_AQADM.create_queue (queue_name
=> XX_CUSTOMER_Q',
queue_table
=> 'xx_event_queue_tbl'
);
DBMS_AQADM.start_queue
(queue_name => XX_CUSTOMER_Q',
enqueue => TRUE);
Grant privileges
After creating and starting queue, we need
to give grants to user schema to manage
the queues.
Example
DBMS_AQADM.grant_queue_privilege
( privilege => 'ALL',
queue_name => 'aq_admin.event_queue',
grantee => 'aq_user
);
Message Properties
Before enqueue a message, We must
create and set the properties of
message by using the below record
type
DBMS_AQ.message_properties_t;
Message Properties(Contd.)
message_properties_tTYPE
message_properties_t IS RECORD (
priority BINARY_INTEGER DEFAULT 1,
delay BINARY_INTEGER DEFAULT NO_delay,
expiration BINARY_INTEGER DEFAULT NEVER,
correlation VARCHAR2(128) DEFAULT NULL,
attempts BINARY_INTEGER,
recipient_list aq$_recipient_list_t,
exception_queue VARCHAR2(51) DEFAULT NULL,
enqueue_time DATE,
state BINARY_INTEGER,
sender_id aq$_agent DEFAULT NULL,
original_msgid RAW(16) DEFAULT NULL);
/
Enqeue options
enqueue_options_t TYPE
enqueue_options_t IS RECORD (
visibilityBINARY_INTEGER DEFAULT
ON_COMMIT,
relative_msgid RAW(16) DEFAULT NULL,
sequence_deviation BINARY_INTEGER
DEFAULT NULL,
transformation VARCHAR2(60) DEFAULT
NULL);
/
Enqueue message
After creating the queue, we can enqueue the
queue using DBMS_AQ
Example ::
DBMS_AQ.enqueue
(queue_name => 'AQADMIN.XX_CUSTOMER_Q',
enqueue_options => aq_enqueue_options,
message_properties
=>
aq_message_properties,
payload
=> aq_message,
msgid
=> raw_message_handle
);
Deqeue options
dequeue_options_t TYPE dequeue_options_t IS
RECORD (
consumer_name VARCHAR2(30) DEFAULT NULL,
dequeue_mode BINARY_INTEGER DEFAULT
REMOVE,
navigation BINARY_INTEGER DEFAULT
NEXT_MESSAGE,
visibility BINARY_INTEGER DEFAULT ON_COMMIT,
wait BINARY_INTEGER DEFAULT FOREVER,
msgid RAW(16) DEFAULT NULL,
correlation VARCHAR2(128) DEFAULT NULL,
deq_condition VARCHAR2(4000) DEFAULT NULL,
signature aq$_sig_prop DEFAULT NULL,
transformation VARCHAR2(60) DEFAULT NULL,
delivery_mode PLS_INTEGER DEFAULT
PERSISTENT);
Dequeue message
After Enqueue the message, We can dequue the
message.
Example ::
DBMS_AQ.dequeue
(queue_name => 'AQADMIN.XX_CUSTOMER_Q',
dequeue_options
=>
aq_dequeue_options,
message_properties
=>
aq_message_properties,
payload
=> aq_message,
msgid
=> raw_message_handle
);