powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ propagation
5 сообщений из 30, страница 2 из 2
AQ propagation
    #40053265
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все-таки оно заработало!!!

Итак, что есть:

Код: plsql
1.
select banner from v$version 



BANNER Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production

Таблица очереди - источника:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
  sys.dbms_aqadm.create_queue_table(
    queue_table => 'STERN.RADIO',
    queue_payload_type => 'RAW',
    sort_list => 'ENQ_TIME',
    multiple_consumers => TRUE,
    compatible => '10.0.0',
    primary_instance => 0,
    secondary_instance => 0,
    storage_clause => 'tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited )');
end;



Сама очередь-источник:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  sys.dbms_aqadm.create_queue(
    queue_name => 'STERN.RADIO_Q',
    queue_table => 'STERN.RADIO',
    queue_type => sys.dbms_aqadm.normal_queue,
    max_retries => 5,
    retry_delay => 0,
    retention_time => 0);
end;



Таблица очереди-приемника:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
  sys.dbms_aqadm.create_queue_table(
    queue_table => 'STERN1.RECEIVER',
    queue_payload_type => 'RAW',
    sort_list => 'ENQ_TIME',
    multiple_consumers => TRUE,
    compatible => '10.0.0',
    primary_instance => 0,
    secondary_instance => 0,
    storage_clause => 'tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited )');
end;



Очередь-приемник:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  sys.dbms_aqadm.create_queue(
    queue_name => 'STERN1.RECEIVER_Q',
    queue_table => 'STERN1.RECEIVER',
    queue_type => sys.dbms_aqadm.normal_queue,
    max_retries => 5,
    retry_delay => 0,
    retention_time => 0);
end;



У очереди-источника определен подписчик:
Код: plsql
1.
2.
3.
4.
5.
begin
  dbms_aqadm.add_subscriber(queue_name => 'STERN.RADIO_Q', 
  subscriber => sys.aq$_agent(null,'STERN1.RECEIVER_Q',null),
  queue_to_queue => true,delivery_mode =>  dbms_aqadm.PERSISTENT);
end;  


И у очереди-источника задан джоб на propagation:
Код: plsql
1.
2.
3.
4.
begin
  dbms_aqadm.schedule_propagation(queue_name => 'STERN.RADIO_Q',
  destination => null,destination_queue => 'STERN1.RECEIVER_Q');
end; 


Отметим здесь, что у подписчика очереди - источника имя выставлено в NULL. Зашедуленный джоб на propagation просто указывает в качестве адресата всю очередь,
без конкретного подписчика.

У очереди-приемника зарегистрирован один подписчик (хотя бы один должен быть, иначе джоб свалится с ошибкой):
Код: plsql
1.
2.
3.
4.
begin
  dbms_aqadm.add_subscriber(queue_name => 'STERN1.RECEIVER_Q',
  subscriber => sys.aq$_agent('kulik',null,null));
end; 



При отсутствии recipients в enqueue-блоке очереди-источника джоб отрабатывает без вопросов.
Вариант без recipients:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
begin
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q',
    enqueue_options =>  v$opt,
    message_properties => v$prop,
    payload => v$send,msgid => v$mid);
   commit;
end; 


При наличии recipients с адресом, оформленным согласно документации Оракл, джоб
не находит адресата сообщения и тупо висит пожизненно...
Вариант с recipients с адресом, оформленным согласно документации Оракл:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
 recipients DBMS_AQ.aq$_recipient_list_t;
begin
    recipients(1) := sys.aq$_agent(null,
      'STERN1.RECEIVER_Q',null); 
  v$prop.recipient_list := recipients; 
  
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q',
    enqueue_options =>  v$opt,
    message_properties => v$prop,
    payload => v$send,msgid => v$mid);
   commit;
end;       



При указании же recipient способом, не описанным в документации Оракл, все происходит
без запинки!
Вариант с recipient способом, не описанным в документации Оракл:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
 recipients DBMS_AQ.aq$_recipient_list_t;
begin
  recipients(1) := sys.aq$_agent(null,
      '"STERN"."RADIO_Q":"STERN1"."RECEIVER_Q',null); 
  v$prop.recipient_list := recipients; 
  
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q',
    enqueue_options =>  v$opt,
    message_properties => v$prop,
    payload => v$send,msgid => v$mid);
   commit;
end; 


В добрый путь, форумчане!
...
Рейтинг: 0 / 0
AQ propagation
    #40053309
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Климов
При указании же recipient способом, не описанным в документации Оракл, все происходит
без запинки!
Вариант с recipient способом, не описанным в документации Оракл:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 declare 
...
begin
  recipients(1) := sys.aq$_agent(null,
      '"STERN"."RADIO_Q":"STERN1"."RECEIVER_Q',null); 
  v$prop.recipient_list := recipients; 
...  
end; 



Здесь точно не потеряна двойная кавычка в конце строки?
...
Рейтинг: 0 / 0
AQ propagation
    #40053768
Андрей Климов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

Ну да, в книжку всралась очепятка )

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
 recipients DBMS_AQ.aq$_recipient_list_t;
begin
  recipients(1) := sys.aq$_agent(null,
      '"STERN"."RADIO_Q":"STERN1"."RECEIVER_Q"',null); 
  v$prop.recipient_list := recipients; 
  
  dbms_aq.enqueue(queue_name => 'STERN.RADIO_Q',
    enqueue_options =>  v$opt,
    message_properties => v$prop,
    payload => v$send,msgid => v$mid);
   commit;
end; 
...
Рейтинг: 0 / 0
AQ propagation
    #40053903
micis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Климов
И все-таки оно заработало!!!
А где здесь бд-линк?
...
Рейтинг: 0 / 0
AQ propagation
    #40054143
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Климов
'"STERN"."RADIO_Q":"STERN1"."RECEIVER_Q"

Так не интересно, типичный отправитель не должен указывать получателя в publish-subscribe - это снижает сложность интеграционных процессов.
Тем более не должен указывать маршрут доставки - в предложенном сценарии проще обойтись вообще без пропагации, подписав конечного получателя прямо на очередь отправителя.
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / AQ propagation
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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