|
Oracle AQ dequeuing an array
|
|||
---|---|---|---|
#18+
Добрый всем день! 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.
Вот достаточно стандартное объявление процедуры: Код: plsql 1. 2. 3. 4. 5. 6.
Теперь я могу знать точное количество сообщений , используя элемент параметра descr - descr.msgid_array.count . Без флага qosflags при регистрации callback процедуры, этот параметр, кстати(точнее совсем некстати) всегда прилетает пустой, точнее, вовсе неициализированный. Но вот теперь с ним могу знать точное количество сообщений, и использовать его внутри callback при вызове dequeue: Код: plsql 1.
Копнув чуть дальше, в объектном типе SYS.AQ$_DESCRIPTOR нашел также элемент ntfnsRecdInGrp . Прочел в доке по AQ: Код: plsql 1. 2.
Решил почему-то, что 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? Что скажете, форумчане? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2021, 13:23 |
|
|
start [/forum/topic.php?fid=52&fpage=28&tid=1880532]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
37ms |
get tp. blocked users: |
2ms |
others: | 285ms |
total: | 418ms |
0 / 0 |