Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ, propagation и список получателей / 4 сообщений из 4, страница 1 из 1
07.05.2014, 10:13
    #38635249
inred
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ, propagation и список получателей
Приветствую уважаемых участников форума!

Есть вопрос по 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
07.05.2014, 10:41
    #38635269
inred
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ, propagation и список получателей
В идеале бы хотелось сделать вот что:
Указать для очереди несколько подписчиков: SUBSCRIBER_1, SUBSCRIBER_2...SUBSCRIBER_N с настроенной пропагацией в 'AQ_USR.TEST_AQ@TESTDB'.

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

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


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