Oracle AQ 传播 - 与收件人合作的秘诀

问题描述

各有千秋!

最后,我让它工作了。我的意思是使用配方列表进行传播,在调用 dbms_aq.enqueue 时在 message_properties 参数中明确指定 所以,我们有什么:

环境

  • Oracle XE 18c Windows 64 位
  • 两种模式:源代码 STERN 队列,STERN1 用于目标队列。

源队列表:

begin
  sys.dbms_aqadm.create_queue_table(
    queue_table => 'STERN.RAdio',queue_payload_type => 'RAW',sort_list => 'ENQ_TIME',multiple_consumers => TRUE,compatible => '10.0.0',primary_instance => 0,secondary_instance => 0,storage_clause => 'tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited )');
end;

源队列:

begin
  sys.dbms_aqadm.create_queue(
    queue_name => 'STERN.RAdio_Q',queue_table => 'STERN.RAdio',queue_type => sys.dbms_aqadm.normal_queue,max_retries => 5,retry_delay => 0,retention_time => 0);
end;

目标队列表:

begin
  sys.dbms_aqadm.create_queue_table(
    queue_table => 'STERN1.RECEIVER',storage_clause => 'tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited )');
end;

目标队列:

begin
  sys.dbms_aqadm.create_queue(
    queue_name => 'STERN1.RECEIVER_Q',queue_table => 'STERN1.RECEIVER',retention_time => 0);
end;

源队列的订阅者:

begin
  dbms_aqadm.add_subscriber(queue_name => 'STERN.RAdio_Q',subscriber => sys.aq$_agent(null,'STERN1.RECEIVER_Q',null),queue_to_queue => true,delivery_mode =>  dbms_aqadm.PERSISTENT);
end;  

请注意:订阅者的名字为NULL。 源队列的传播作业:

begin
  dbms_aqadm.schedule_propagation(queue_name => 'STERN.RAdio_Q',destination => null,destination_queue => 'STERN1.RECEIVER_Q');
end; 

传播作业的目标只是一个队列。

目标队列有一个订阅者(至少应该有一个订阅者,否则作业将失败):

begin
  dbms_aqadm.add_subscriber(queue_name => 'STERN1.RECEIVER_Q',subscriber => sys.aq$_agent('kulik',null,null));
end; 

当入队块中没有收件人时,一切正常:

declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
begin
  dbms_aq.enqueue(queue_name => 'STERN.RAdio_Q',enqueue_options =>  v$opt,message_properties => v$prop,payload => v$send,msgid => v$mid);
   commit;
end; 

如果有一个接收者,按照 Oracle 文档中指定的方式形成,作业将无法找到目的地并永远挂起......

declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
 recipients DBMS_AQ.aq$_recipient_list_t;
begin
    recipients(1) := sys.aq$_agent(null,null); 
  v$prop.recipient_list := recipients; 
  
  dbms_aq.enqueue(queue_name => 'STERN.RAdio_Q',msgid => v$mid);
   commit;
end;       

如果有收件人,按照Oracle 文档中未指定的方式形成,一切正常!

declare 
 v$opt dbms_aq.enqueue_options_t;
 v$prop dbms_aq.message_properties_t;
 v$mid raw(16); 
 v$send raw(16) := utl_raw.cast_to_raw('Gromozeka 1');
 recipients DBMS_AQ.aq$_recipient_list_t;
begin
  recipients(1) := sys.aq$_agent(null,'"STERN"."RAdio_Q":"STERN1"."RECEIVER_Q"',msgid => v$mid);
   commit;
end; 

希望这会有所帮助。 问候,安德鲁。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)