Oracle Обратный вызов очереди очереди не работает - PullRequest
1 голос
/ 28 января 2020

У меня есть 2 схемы: (A и B) В схеме A я создал функцию обратного вызова очереди очереди и обратного вызова. Из схемы AI предоставлена ​​схема B для выполнения процедуры постановки в очередь. Когда я ставлю в очередь данные из схемы A -> все работает нормально. Когда я вызываю процедуру обработки данных A.enqueue из схемы B -> данные ставятся в очередь, но они остаются в состоянии READY .... Функция обратного вызова в очереди не вызывается. Вот тестовый скрипт:

У меня есть пользователь A

create table test_table (id number, event_name varchar2(200), descr nvarchar2(200));  
/  
create or replace type test_type as object (id number, event_name varchar2(200), descr nvarchar2(200))  
/  
create or replace procedure test_proc(context  in raw,  
                                      reginfo  in sys.aq$_reg_info,  
                                      descr    in sys.aq$_descriptor,  
                                      payload  in raw,  
                                      payloadl in number) as  
  v_dequeue_options    dbms_aq.dequeue_options_t;  
  v_message_id         raw(16);  
  v_payload_message    test_type;  
  v_message_properties dbms_aq.message_properties_t;  
begin  
  v_dequeue_options.msgid         := descr.msg_id;  
  v_dequeue_options.consumer_name := descr.consumer_name;  
  v_dequeue_options.wait          := dbms_aq.no_wait;  
  DBMS_AQ.DEQUEUE(queue_name         => 'event_queue',  
                  dequeue_options    => v_dequeue_options,  
                  message_properties => v_message_properties,  
                  payload            => v_payload_message,  
                  msgid              => v_message_id);  


  insert into test_table  
    (id, event_name, descr)  
  values  
    (v_payload_message.id, v_payload_message.event_name, v_payload_message.descr);  


  commit;  
end;  
/  
create or replace procedure enq_data(p_msg in varchar2) is  
  l_enqueue_options    DBMS_AQ.enqueue_options_t;  
  l_message_properties DBMS_AQ.message_properties_t;  
  l_message_handle     raw(16);  
  l_event_msg          test_type;  
begin  
  l_event_msg := test_type(2, p_msg, null);  
  DBMS_AQ.enqueue(queue_name         => 'cp.event_queue',  
                  enqueue_options    => l_enqueue_options,  
                  message_properties => l_message_properties,  
                  payload            => l_event_msg,  
                  msgid              => l_message_handle);  


  commit;  
end;  
/  
begin  
 DBMS_AQADM.create_queue_table(    
   queue_table        =>  'event_queue_tab',   
    --sort_list => 'COMMIT_TIME',  
    multiple_consumers => false,  
    message_grouping => sys.dbms_aqadm.none,  
    compatible => '10.0.0',  
    primary_instance => 0,    
    secondary_instance => 0,  
    queue_payload_type =>  'test_type');   


  DBMS_AQADM.create_queue(    
   queue_name         =>  'event_queue',    
   queue_table        =>  'event_queue_tab');  


  DBMS_AQADM.start_queue(    
   queue_name         => 'event_queue',    
   enqueue            => TRUE);  
end;  
/  
begin  
  dbms_aq.register (  
     sys.aq$_reg_info_list (  
        sys.aq$_reg_info (user || '.' || upper('event_queue'),  
                          dbms_aq.namespace_aq,  
                          'plsql://' || user || '.test_proc',  
                          hextoraw ('FF'))),  
     1);  
  commit;  
end;  
/  


grant execute on enq_data to B;  
grant select on test_table to B;  


connect with user A

---- THIS PART IS FOR TESTING  
DECLARE  
BEGIN  
  enq_data('sdadasd');  
END;  
/  
select * from test_table;  


connect with user B

---- THIS PART IS FOR TESTING  
DECLARE  
BEGIN  
  A.enq_data('sdadasd');  
END;  
/  
select * from A.test_table;  

Я вижу, что записи находятся в состоянии READY:

select * from aq $ event_queue_tab;

Почему так .... Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...