Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Oracle Streams Advanced Queuing - не получается записать сообщение из очереди в таблицу  [new]
orarara
Guest
Здравствуйте, пытаюсь ловить сообщения из очереди для последующей обработки:

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

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;


begin 
dbms_aqadm.grant_system_privilege 
('ENQUEUE_ANY','AQ',FALSE); 
 dbms_aqadm.grant_system_privilege 
('DEQUEUE_ANY','AQ',FALSE); 
end; 


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

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

 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 Таблицу, в которую я планирую писать сообщения

create table message_table( msg varchar2(4000) ); 


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

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; 


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; 


begin 
dbms_aqadm.add_subscriber 
( queue_name => 'aq.msg_queue', 
subscriber => sys.aq$_agent( 'recipient', null, null ) ); 
end; 


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. Проверяю, есть ли записи в таблице, перед тем как толкнуть сообщение в очередь.
select * from message_table; 


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

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

 exec enqueue_msg( 'This is a test....' ); 


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

select * from message_table; 


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

PS ORACLE 11g
10 фев 17, 05:48    [20198901]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить