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

Environment: Oracle 18XE 64-bit for Windows.
Создал очередь. Это простой point-to-point messaging, single_consumer и нет propagation.
Очередь - persistent.

Задался вопросом - как поступить, если я хочу знать точное количество сообщений для dequeue, которое поступило на вход моей callback - процедуры? Т.е. которое прилетело от встроенного Ораклового джоба. И нашел единственный легальный путь. Это - зарегистрировать callback с параметром qosflags , установленным в dbms_aq.NTFN_QOS_PAYLOAD .
Вот блок регистрации:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare 
    v_qosflags number :=  dbms_aq.NTFN_QOS_PAYLOAD;
    r_info SYS.AQ$_REG_INFO;
   begin
      r_info := SYS.AQ$_REG_INFO(
                'STERN.FOUNDERS_QUEUE',
                DBMS_AQ.NAMESPACE_AQ,
                'plsql://stern.dosomecalc',
                HEXTORAW('FF')
                );
       r_info.qosflags := v_qosflags; 
       r_info.ntfn_grouping_class := dbms_aq.NTFN_GROUPING_CLASS_TIME ;  
       r_info.ntfn_grouping_value := 60;
       r_info.ntfn_grouping_type := dbms_aq.NTFN_GROUPING_TYPE_SUMMARY ;    
       
       DBMS_AQ.REGISTER (
          SYS.AQ$_REG_INFO_LIST(
                     r_info
             ),
          1
          );
 end;



Вот достаточно стандартное объявление процедуры:
Код: plsql
1.
2.
3.
4.
5.
6.
create or replace procedure dosomecalc
(context    RAW
                             ,reginfo    SYS.AQ$_REG_INFO
                             ,descr      SYS.AQ$_DESCRIPTOR
                             ,payload    raw
                             ,payloadl   NUMBER)



Теперь я могу знать точное количество сообщений , используя элемент параметра descr -
descr.msgid_array.count . Без флага qosflags при регистрации callback процедуры, этот параметр, кстати(точнее совсем некстати) всегда прилетает пустой, точнее, вовсе неициализированный.
Но вот теперь с ним могу знать точное количество сообщений, и использовать его внутри callback при вызове dequeue:
Код: plsql
1.
Dbms_aq.dequeue_array(…, array_size => descr.msgid_array.count,…)


Копнув чуть дальше, в объектном типе SYS.AQ$_DESCRIPTOR нашел также элемент ntfnsRecdInGrp .
Прочел в доке по AQ:
Код: plsql
1.
2.
msgid_array  - Group notification message ID list 
  ntfnsRecdInGrp - Notifications received in group


Решил почему-то, что ntfnsRecdInGrp просто дублирует размер массива descr.msgid_array .
Для удобства программиста, так сказать...
Оказалось, ошибся. Когда при dequeue используется descr.msgid_array.count - все точно срастается, без проблем. А вот когда ntfnsRecdInGrp - нет.
Обратил внимание, что иногда эти параметры равны, иногда - нет.

Прилетает все это хозяйство из EMON. На форумах пишут , что общая схема процесса такова:
Enqueuer записывает сообщение в очередь.
EMON уведомляется об этом.
EMON re-enqueue'ит сообщение в свою встроенную очередь AQ_SRVNTFN_TABLE_Q.
EMON dequeue'ит это сообщение из AQ_SRVNTFN_TABLE_Q
EMON вызывает джоб, который в свой черед, вызывает callback.
callback dequeue'ит сообщения из основной очереди.

При всем при этом непонятно, если msgid_array - список реальных сообщений, которые поступили на вход процедуры, то что же тогда такое ntfnsRecdInGrp?

Что скажете, форумчане?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle AQ dequeuing an array
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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