oracle advanced queue - rule based subscriber

/*
Oracle Advance Queue da rule based subscriber lar ile ilgili bir örnek sunacağım
demo_q adlı bir queue yaratacağız ve bu queue ya gönderilecek mesajlar için
3 tane rule based subscriber tanımlayacağız.
Bunlardan biri tüm mesajları almak isteyen
diğeri sadece pozitif id ye sahip bir diğeri de
negatif id ye sahip mesajları almak isteyen subscriberlar olacak.
Bu modelde queue ya enqueue edilecek her mesaj subscriber ların
rule ları na bakılarak oracle tarafından gerekirse mesaji almak isteyen
her subscriber icin bir kopya olacak şekilde yaratilacak.
*/
--Once Queue Type ımızı yaratıyoruz

CREATE OR REPLACE TYPE qtype AS OBJECT
(
-- Author : SC
-- Created : 29/11/2007 9:02:51 PM
-- Purpose :

-- Attributes
id NUMBER

)
;
/

-- Queue Tablo muzu multiple consumer olarak yaratiyoruz
BEGIN
dbms_aqadm.create_queue_table(queue_table => 'DEMO_QT',
queue_payload_type => 'QTYPE',
multiple_consumers => TRUE);
END;
/

--Queue muzu yaratiyoruz
BEGIN
sys.dbms_aqadm.create_queue(queue_name => 'DEMO_Q',
queue_table => 'DEMO_QT',
queue_type => sys.dbms_aqadm.normal_queue,
max_retries => 5,
retry_delay => 0,
retention_time => 0);
END;
/

--Queue yu enqueu ve dequeu yapilabilmesi icin baslatiyoruz
BEGIN

dbms_aqadm.start_queue(queue_name => 'demo_q');
END;
/

--Mesajlar icin subscriber larimizi ekleyelim

--Tum mesajlari alacak subscriber
BEGIN
dbms_aqadm.add_subscriber(queue_name => 'demo_Q',
subscriber => sys.aq$_agent('all_sub', NULL, 0));
END;
/

--Sadece Pozitif id ye mesajlari alacak subscriber
BEGIN
dbms_aqadm.add_subscriber(queue_name => 'demo_Q',
subscriber => sys.aq$_agent('positive_sub',
NULL,
0),
rule => 'tab.user_data.id > 0');
END;
/

--Sadece Negatif id ye sahip mesajlari alacak subscriber
BEGIN
dbms_aqadm.add_subscriber(queue_name => 'demo_Q',
subscriber => sys.aq$_agent('negative_sub',
NULL,
0),
rule => 'tab.user_data.id <0');
END;
/

--Bu mesaj positive ve all subscriber lari icin yaratilacak
DECLARE
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message qtype;

BEGIN

dbms_aq.enqueue(queue_name => 'demo_q',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => qtype(1),
msgid => message_handle);
COMMIT;
END;
/

-- Mesajin bir kopyasi positive subscriber icin de yaratildi
SELECT t.queue, t.msg_id, t.consumer_name, t.user_data.id FROM aq$demo_qt t;

--Bu mesaj negative ve all subscriber lari icin yaratilacak
DECLARE

enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message qtype;

BEGIN

dbms_aq.enqueue(queue_name => 'demo_q',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => qtype(-1),
msgid => message_handle);
COMMIT;
END;
/

-- mesaj in bir kopyasi negative subscriber icin de yaratildi
SELECT t.queue, t.msg_id, t.consumer_name, t.user_data.id FROM aq$demo_qt t WHERE t.user_data.id = -1;

--Bu mesaj sadece ve sadece all subscriber icin yaratilacak
DECLARE

enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message qtype;

BEGIN

dbms_aq.enqueue(queue_name => 'demo_q',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => qtype(0),
msgid => message_handle);
COMMIT;
END;
/

-- mesaj sadece all_subscriber icin yaratildi
SELECT t.queue, t.msg_id, t.consumer_name, t.user_data.id
FROM aq$demo_qt t
WHERE t.user_data.id = 0;

/*
önemli ayrıntı

her subscriber ancak queue ya subscribe olduktan sonra gelen mesajlari alabilir.

Referans
oracle® streams advanced queuing USER 's Guide and Reference
10g Release 2 (10.2)
1.3.2 Multiconsumer Dequeuing of the Same Message
*/

Comments

Popular posts from this blog

Pyppeteer fix for BrowserError: Browser closed unexpectedly

overlay filesystem and containers

How to add pagination to django comments for your model