powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ, propagation и список получателей
4 сообщений из 4, страница 1 из 1
AQ, propagation и список получателей
    #38635249
inred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую уважаемых участников форума!

Есть вопрос по AQ и пропагации сообщения через DBLink.

Есть локальная очередь DEV_AQ, подписчик по умолчанию, пропагация по DBLink в другую очередь TEST_AQ@TESTDB.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    dbms_aqadm.create_queue(queue_name => 'DEV_AQ'
                           ,queue_table => 'DEV_AQ_TAB'
                           ,comment => 'QUEUE ON DEV_DB FOR INCOMING MESSAGES'
                           );

    dbms_aqadm.add_subscriber(queue_name => 'DEV_AQ'
                             ,subscriber => sys.aq$_agent(name => 'REMOTE_SUBSCRIBER'
                                                         ,address => 'AQ_USR.TEST_AQ@TESTDB'
                                                         ,protocol => null
                                                         )
                             ,queue_to_queue => true
                             );

    dbms_aqadm.schedule_propagation(queue_name => 'AQ_USR.DEV_AQ'
                                    ,destination => 'TESTDB'
                                    ,destination_queue => 'AQ_USR.TEST_AQ'
                                    ); 



Есть блок постановки сообщения в очередь.
Без указания списка получателей (v_msg_properties.recipient_list) сообщения уходят для получателя по-умолчанию (REMOTE_SUBSCRIBER) и пропагация в удаленную очередь срабатывает нормально (queue_to_queue => true).
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE
   v_options dbms_aq.enqueue_options_t;
   v_msg_properties  dbms_aq.message_properties_t;
   v_handle raw(16);   
   v_body xmltype; 
BEGIN
   v_body:= xmltype('<body><time>'||to_char(sysdate,'HH24:MI:SS')||'</time><val>'||sys_guid()||'</val></body>');
   dbms_aq.enqueue(queue_name => 'DEV_AQ' 
                  ,enqueue_options => v_options
                  ,message_properties => v_msg_properties
                  ,payload => v_body
                  ,msgid => v_handle
                  );
   COMMIT;
END;



Но вот если указать получателей вручную, то пропагация не срабатывеает. Адрес, естественно, имеет формат 'AQ_USR.TEST_AQ@TESTDB'.
Код: plsql
1.
2.
3.
4.
   v_msg_properties.recipient_list(1) := SYS.AQ$_AGENT(name => 'REMOTE_SUBSCRIBER'
						      ,address => 'AQ_USR.TEST_AQ@TESTDB'
						      ,protocol => null 
						      );



Получается, что пропагация работает только для умолчательных подписчиков очереди, которые были добавлены командой add_subscriber? Или можно как-то сделать пропагацию для получателей, указанных вручную?
...
Рейтинг: 0 / 0
AQ, propagation и список получателей
    #38635269
inred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В идеале бы хотелось сделать вот что:
Указать для очереди несколько подписчиков: SUBSCRIBER_1, SUBSCRIBER_2...SUBSCRIBER_N с настроенной пропагацией в 'AQ_USR.TEST_AQ@TESTDB'.

1. В разных pl/sql-блоках формируются разного типа xml-ки и отправляются разным получателям (т.е. указываем получателя в recipient_list).
2. Делается пропагация в удаленную очередь.
3. В удаленной БД разработчики принимают эти сообщения и уже проводят индивидуальную их обработку в зависимости от того, какой получатель принял сообщение.
...
Рейтинг: 0 / 0
AQ, propagation и список получателей
    #38635530
inred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Покурил доки на сайте оракла по этой теме и вроде придумал вариант как можно сделать.

Будем использовать правило (rule) при добавлении подписчика для очереди.
От чистого XMLTYPE пришлось отказаться, но ввиду того, что очень нужно использовать именно XML, то сделали следующий формат передачи сообщений:

Код: plsql
1.
2.
3.
4.
create or replace type t_payload as object(msgid number
					  ,msg_type varchar2(10)
					  ,msg_body sys.xmltype
					  );


В msg_type будет храниться некий строковый тип сообщения, это поле затем будет использоваться в rule.

Подписчиков для очереди добавляем следующим образом:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    dbms_aqadm.add_subscriber(queue_name => 'DEV_AQ'
                             ,subscriber => sys.aq$_agent(name => 'SUBSCRIBER_T_01'
                                                         ,address => 'AQ_USR.TEST_AQ@TESTDB'
                                                         ,protocol => null
                                                         )
                             ,queue_to_queue => true
                             ,rule => 'tab.user_data.msg_type=''01'''
                             );

    dbms_aqadm.add_subscriber(queue_name => 'DEV_AQ'
                             ,subscriber => sys.aq$_agent(name => 'SUBSCRIBER_T_02'
                                                         ,address => 'AQ_USR.TEST_AQ@TESTDB'
                                                         ,protocol => null
                                                         )
                             ,queue_to_queue => true
                             ,rule => 'tab.user_data.msg_type=''02'''
                             );

    dbms_aqadm.add_subscriber(queue_name => 'DEV_AQ'
                             ,subscriber => sys.aq$_agent(name => 'SUBSCRIBER_T_03'
                                                         ,address => 'AQ_USR.TEST_AQ@TESTDB'
                                                         ,protocol => null
                                                         )
                             ,queue_to_queue => true
                             ,rule => 'tab.user_data.msg_type=''03'''
                             );



Получается, что в разных pl/sql блоках будут формироваться сообщения с разными msg_type (01, 02 или 03) и при постановке сообщения в очередь оно будет ставиться только для соответствующего получателя.

Ну а на стороне удаленной БД будут работать 3 подписчика, извлекать свои сообщения и обрабатывать их как надо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
AQ, propagation и список получателей
    #39764109
alibekmister
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Интересно описали. В итоге получилось?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ, propagation и список получателей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]