Просто нужно различать subscriber и recipient
dbms_aqadm.add_subscriber - создает подписчика для очереди.
Если при постановке сообщения указывает список получателей (recipient_list) то сообщение будет направлено только им.
-- Создаем таблицу очередей и очередь
SQL> BEGIN
2 dbms_aqadm.create_queue_table(queue_table => 'TQ1',
3 queue_payload_type => 'RAW',
4 multiple_consumers => TRUE);
5 dbms_aqadm.create_queue(queue_name => 'Q1',
6 queue_table => 'TQ1');
7 dbms_aqadm.start_queue('Q1',TRUE,TRUE);
8 END;
9 /
PL/SQL procedure successfully completed.
-- Пытаемся поставить в очередь сообщение без указания получателя.
-- Ожидаемый результат - ошибка
SQL> DECLARE
2 l_enq dbms_aq.enqueue_options_t;
3 l_mp dbms_aq.message_properties_t;
4 l_msgid RAW(16);
5 begin
6 dbms_aq.enqueue(queue_name => 'Q1',
7 enqueue_options => l_enq,
8 message_properties => l_mp,
9 payload => utl_raw.cast_to_raw('No subscribers'),
10 msgid => l_msgid);
11 END;
12 /
DECLARE
*
ERROR at line 1:
ORA-24033: no recipients for message
ORA-06512: at "SYS.DBMS_AQ", line 6
ORA-06512: at "SYS.DBMS_AQ", line 216
ORA-06512: at line 6
-- Ставим в очередь сообщение для получателя Billing
SQL> DECLARE
2 l_enq dbms_aq.enqueue_options_t;
3 l_mp dbms_aq.message_properties_t;
4 l_msgid RAW(16);
5 rcpt_list dbms_aq.aq$_recipient_list_t;
6 begin
7 rcpt_list(1) := sys.aq$_agent('Billing', null, null);
8 l_mp.recipient_list := rcpt_list;
9 dbms_aq.enqueue(queue_name => 'Q1',
10 enqueue_options => l_enq,
11 message_properties => l_mp,
12 payload => utl_raw.cast_to_raw('For Billing'),
13 msgid => l_msgid);
14 END;
15 /
PL/SQL procedure successfully completed.
SQL> COMMIT
2 /
Commit complete.
SQL> SELECT queue, consumer_name, utl_raw.cast_to_varchar2(user_data) data FROM AQ$TQ1
2 /
QUEUE CONSUMER_NAME DATA
-------------------- -------------------- ------------------------------
Q1 BILLING For Billing
-- Дабавляем подписчика по умолчанию для очереди
SQL> begin
2 dbms_aqadm.add_subscriber(queue_name => 'Q1',subscriber => SYS.AQ$_AGENT('Subscriber',NULL,NUL
L));
3 end;
4 /
PL/SQL procedure successfully completed.
-- Ставим в очередь сообщение без явного указания получателей
-- Ожидаемый результат - сообщение будет поставлено только для подписчиков по умолчанию
SQL> DECLARE
2 l_enq dbms_aq.enqueue_options_t;
3 l_mp dbms_aq.message_properties_t;
4 l_msgid RAW(16);
5 begin
6 dbms_aq.enqueue(queue_name => 'Q1',
7 enqueue_options => l_enq,
8 message_properties => l_mp,
9 payload => utl_raw.cast_to_raw('For Subscriber'),
10 msgid => l_msgid);
11 END;
12 /
PL/SQL procedure successfully completed.
SQL> commit
2 /
Commit complete.
SQL> SELECT queue, consumer_name, utl_raw.cast_to_varchar2(user_data) data FROM AQ$TQ1
2 /
QUEUE CONSUMER_NAME DATA
-------------------- -------------------- ------------------------------
Q1 BILLING For Billing
Q1 SUBSCRIBER For Subscriber
-- Ставим в очередь сообщение для Billing и Subscriber
-- Ожидаемый результат - сообщение будет поставлено для Billing и Subscriber
SQL> DECLARE
2 l_enq dbms_aq.enqueue_options_t;
3 l_mp dbms_aq.message_properties_t;
4 l_msgid RAW(16);
5 rcpt_list dbms_aq.aq$_recipient_list_t;
6 begin
7 rcpt_list(1) := sys.aq$_agent('Billing', null, null);
8 rcpt_list(2) := sys.aq$_agent('Subscriber', null, null);
9 l_mp.recipient_list := rcpt_list;
10 dbms_aq.enqueue(queue_name => 'Q1',
11 enqueue_options => l_enq,
12 message_properties => l_mp,
13 payload => utl_raw.cast_to_raw('For Subscriber and Billing'),
14 msgid => l_msgid);
15 END;
16 /
PL/SQL procedure successfully completed.
SQL> SELECT queue, consumer_name, utl_raw.cast_to_varchar2(user_data) data FROM AQ$TQ1
2 /
QUEUE CONSUMER_NAME DATA
-------------------- -------------------- ------------------------------
Q1 BILLING For Billing
Q1 SUBSCRIBER For Subscriber
Q1 BILLING For Subscriber Billing
Q1 SUBSCRIBER For Subscriber Billing