Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу / 1 сообщений из 1, страница 1 из 1
10.02.2017, 05:48
    #39401965
orarara
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу
Здравствуйте, пытаюсь ловить сообщения из очереди для последующей обработки:

1. Создаю пользователя со всеми (наверное?) необходимыми правами от имени SYS:

Код: plsql
1.
2.
3.
4.
CREATE USER aq IDENTIFIED BY aq;
GRANT CONNECT, RESOURCE, aq_administrator_role TO aq; 
GRANT EXECUTE ON dbms_aq TO aq; 
GRANT EXECUTE ON dbms_aqadm TO aq;



Код: plsql
1.
2.
3.
4.
5.
6.
begin 
dbms_aqadm.grant_system_privilege 
('ENQUEUE_ANY','AQ',FALSE); 
 dbms_aqadm.grant_system_privilege 
('DEQUEUE_ANY','AQ',FALSE); 
end; 



2. Перелогиниваюсь на созданного пользователя
3.Создаю тип
Код: plsql
1.
CREATE type aq.Message_typ as object ( subject VARCHAR2(30), text VARCHAR2(80)); 


4. Создаю очередь и связанную таблицу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 begin 
DBMS_AQADM.CREATE_QUEUE_TABLE 
( queue_table => 'aq.objmsgs80_qtab', 
queue_payload_type => 'aq.Message_typ', 
multiple_consumers => TRUE ); 

DBMS_AQADM.CREATE_QUEUE 
( queue_name => 'MSG_QUEUE', 
queue_table => 'aq.objmsgs80_qtab'); 

DBMS_AQADM.START_QUEUE 
( queue_name => 'MSG_QUEUE'); 
 end; 



4.1 Таблицу, в которую я планирую писать сообщения

Код: plsql
1.
create table message_table( msg varchar2(4000) ); 



5. Создаю процедуры

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create procedure enqueue_msg( p_msg in varchar2 ) 
as 
enqueue_options dbms_aq.enqueue_options_t; 
message_properties dbms_aq.message_properties_t; 
message_handle RAW(16); 
message aq.message_typ; 
BEGIN 
message := message_typ('NORMAL MESSAGE', p_msg ); 
dbms_aq.enqueue(queue_name => 'msg_queue', 
enqueue_options => enqueue_options, 
message_properties => message_properties, 
payload => message, 
 msgid => message_handle); 
end; 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace procedure notifyCB( context raw, 
reginfo sys.aq$_reg_info, 
descr sys.aq$_descriptor, 
payload raw, 
payloadl number) 
as 
dequeue_options dbms_aq.dequeue_options_t; 
message_properties dbms_aq.message_properties_t; 
message_handle RAW(16); 
message aq.message_typ; 
BEGIN 
dequeue_options.msgid := descr.msg_id; 
dequeue_options.consumer_name := descr.consumer_name; 
DBMS_AQ.DEQUEUE(queue_name => descr.queue_name, 
dequeue_options => dequeue_options, 
message_properties => message_properties, 
 payload => message, 
msgid => message_handle); 
insert into message_table values 
( 'Dequeued and processed "' || message.text || '"' ); 
COMMIT; 
 END; 



Код: plsql
1.
2.
3.
4.
5.
begin 
dbms_aqadm.add_subscriber 
( queue_name => 'aq.msg_queue', 
subscriber => sys.aq$_agent( 'recipient', null, null ) ); 
end; 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN 
dbms_aq.register 
( sys.aq$_reg_info_list( 
sys.aq$_reg_info('AQ.MSG_QUEUE:RECIPIENT', 
DBMS_AQ.NAMESPACE_AQ, 
'plsql://AQ.notifyCB', 
HEXTORAW('FF')) ) , 1 ); 
end; 



6. Проверяю, есть ли записи в таблице, перед тем как толкнуть сообщение в очередь.
Код: plsql
1.
select * from message_table; 



Таблица соответственно пуста.

7. Отправляю сообщение

Код: plsql
1.
 exec enqueue_msg( 'This is a test....' ); 



Ну и делаю коммит, естественно. Затем проверяю таблицу снова:

Код: plsql
1.
select * from message_table; 



Она снова пуста. Но в очереди сообщение висит. Что может быть не так?

PS ORACLE 11g
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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