powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_AQ Дождаться получения всех сообщений
3 сообщений из 3, страница 1 из 1
DBMS_AQ Дождаться получения всех сообщений
    #39687869
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Первый раз сталкиваюсь с DBMS_AQ и прошу подсказать как правильнее реализовать следующее.
Одна сессия потихоньку пихает в очередь сообщения, а вторая вычитывает. Необходимо чтобы вторая сессия вычитала все сообщения, после чего отработала.

Создадим все необходимое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
--создаем таблицу для очереди
BEGIN
  DBMS_AQADM.CREATE_QUEUE_TABLE(
     queue_table         => 'AQ_TAB',
     queue_payload_type  => 'MSG_TYPE');
END;
/
--создаем саму очередь
BEGIN
   DBMS_AQADM.CREATE_QUEUE(
      queue_name         =>  'QUEUE1',
      queue_table        =>  'AQ_TAB');
END;
/

--включаем очередь
BEGIN
   DBMS_AQADM.START_QUEUE(
      queue_name        => 'QUEUE1');
END;



В первой сессии начинаем передавать сообщения с задержкой
Код: 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.
--процедура добавлящая сообщение в очередь
declare
procedure enqueue_msg (p_msg in varchar2)
as
   enqueue_options DBMS_AQ.enqueue_options_t;
   msg_properties  DBMS_AQ.message_properties_t;
   msg_handle      RAW(16);
   msg             msg_type;
BEGIN
   msg := msg_type('Subject', p_msg);
   DBMS_AQ.ENQUEUE(
      queue_name              => 'QUEUE1',
      enqueue_options         => enqueue_options,
      message_properties      => msg_properties,
      payload                 => msg,
      msgid                   => msg_handle);
   COMMIT;
END;
begin
  for r in(select table_name from dba_tables where rownum<=10) 
  loop
    enqueue_msg(r.table_name);
    dbms_lock.sleep(3);
  end loop;
end;
/



Во второй сессии читаем:
Код: 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.
DECLARE
  dequeue_options      DBMS_AQ.dequeue_options_t;
  message_properties   DBMS_AQ.message_properties_t;
  message_handle       RAW (16);
  msg                  msg_type;
  no_messages exception;
  msg_content          VARCHAR2 (4000);
  PRAGMA EXCEPTION_INIT (no_messages, -25228);
BEGIN
  dequeue_options.wait := DBMS_AQ.NO_WAIT;    
LOOP
  DBMS_AQ.DEQUEUE (queue_name           => 'QUEUE1',
                      dequeue_options      => dequeue_options,
                      message_properties   => message_properties,
                      payload              => msg,
                      msgid                => message_handle
                     );
  DBMS_OUTPUT.PUT_LINE( msg.text);
END LOOP;
  EXCEPTION
  WHEN no_messages
  THEN
     DBMS_OUTPUT.PUT_LINE ('No more messages left');
END;


Если убирать dequeue_options.wait := DBMS_AQ.NO_WAIT; - вычитывает все сообщения, но потом еще черти знает сколько висит.
Понимаю, что можно условно передавать в конце цикла отправляющей сессии сообщение типа "Finish", а в принимающей сессии вычитав такое сообщение выходить из цикла.
Но может штатный механизм позволяет сделать это без таких костылей?
...
Рейтинг: 0 / 0
DBMS_AQ Дождаться получения всех сообщений
    #39687871
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagor,
не зацепил, вначале тип создаем, конечно
Код: plsql
1.
2.
3.
4.
5.
--Создаем тип сообщения
CREATE TYPE msg_type AS object(
   subj varchar2(100),
   text varchar2(500));
/
...
Рейтинг: 0 / 0
DBMS_AQ Дождаться получения всех сообщений
    #39687913
0bsid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
  queue_options.DEQUEUE_MODE  := DBMS_AQ.REMOVE; --BROWSE;
  queue_options.NAVIGATION    := DBMS_AQ.FIRST_MESSAGE;
  queue_options.VISIBILITY    := DBMS_AQ.IMMEDIATE;


попробуй такие опции
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_AQ Дождаться получения всех сообщений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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