3

我想在 Oracle AQ (11) 中设置传播。

我想从队列表“QT”中的队列“Q”传播到队列表“QTD”中的队列“QD”。

这是我的设置:

DECLARE 
 subscriber sys.aq$_agent; 
BEGIN
 DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'QT',multiple_consumers=>TRUE,queue_payload_type=>'RAW');
 DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'QTD',queue_payload_type=>'RAW');
 DBMS_AQADM.CREATE_QUEUE(queue_name => 'Q', queue_table => 'QT'); 
 DBMS_AQADM.CREATE_QUEUE(queue_name => 'QD', queue_table => 'QTD'); 
 DBMS_AQADM.START_QUEUE(queue_name => 'Q');
 DBMS_AQADM.START_QUEUE(queue_name => 'QD');
 subscriber := sys.aq$_agent('SUB', 'QD', NULL);
 DBMS_AQADM.ADD_SUBSCRIBER(queue_name => 'Q',subscriber => subscriber, queue_to_queue => TRUE);
 DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name => 'Q');
END;
/

我从 Java aqapi 客户端发送消息。消息发送没有错误,我可以在“Q”队列中看到它:

select * from QT;

"Q_NAME"    "MSGID" "CORRID"    "PRIORITY"  "STATE" "DELAY" "EXPIRATION"    "TIME_MANAGER_INFO" "LOCAL_ORDER_NO"    "CHAIN_NO"  "CSCN"  "DSCN"  "ENQ_TIME"  "ENQ_UID"   "ENQ_TID"   "DEQ_TIME"  "DEQ_UID"   "DEQ_TID"   "RETRY_COUNT"   "EXCEPTION_QSCHEMA" "EXCEPTION_QUEUE"   "STEP_NO"   "RECIPIENT_KEY" "DEQUEUE_MSGID" "SENDER_NAME"   "SENDER_ADDRESS"    "SENDER_PROTOCOL"   "USER_DATA" "USER_PROP"
"Q" FC914BFDC7489ECEE040010A393F3DD1    ""  1   0               0   0   0   0   24-JUN-14 07.56.27.258348000 AM "RISKOPALL" "9.5.283837"        ""  ""  0   ""  ""  0   0       ""  ""  0   (BLOB)  

但我在“QD”目标队列中看不到它:

select * from QTD;

显示空结果。

你知道它有什么问题吗?

我已经尝试过 ENABLE_PROPAGATION_SCHEDULE,但它已经在 SCHEDULE_PROPAGATION 之后启用。这会导致错误。

我检查了这个页面:http : //docs.oracle.com/cd/B28359_01/server.111/b28420/aq_trbl.htm 但我找不到 DBA_QUEUE_SCHEDULES 视图。我有管理员权限。我该去哪里找呢?我该如何解决传播问题?

任何帮助真的很感激!

4

1 回答 1

3

解决了!

如果目标队列(消息传播到的地方)是单消费者队列,那么订阅者名称必须设置为 NULL!这是我的问题。它记录在 11g 文档中:

http://docs.oracle.com/cd/B28359_01/server.111/b28420/aq_admin.htm#i1008642

“如果目标队列是单个消费者队列,则代理名称应为 NULL。”

我的设置中有问题的行:

subscriber := sys.aq$_agent('SUB', 'QD', NULL);

它应该是:

subscriber := sys.aq$_agent(NULL, 'QD', NULL);

在找出问题时,下面的故障排除指南非常有帮助:

https://blogs.oracle.com/db/entry/oracle_support_master_note_for_troubleshooting_advanced_queuing_and_oracle_streams_propagation_issue

第 4.3 节建议检查警报日志。我检查了它们,确实在我找到的跟踪文件中

kwqpdest: exception 24039
kwqpdest: Error 24039 propagating to "TEST"."QD"

之后,找出为什么抛出 24039 并不难。

所以毕竟这是我的 11g 服务器中的工作设置。它将消息从源传播到三个目标。源是多消费者队列(必须是),目标是单消费者队列:

BEGIN
 DBMS_AQADM.DROP_QUEUE_TABLE(queue_table=>'QT', force => TRUE);
 DBMS_AQADM.DROP_QUEUE_TABLE(queue_table=>'QTD', force => TRUE);
END;
/
DECLARE
 subscriber sys.aq$_agent;
BEGIN
 DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'QT',multiple_consumers=>TRUE,
  queue_payload_type=>'SYS.AQ$_JMS_TEXT_MESSAGE');
 DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'QTD',multiple_consumers=>FALSE,
  queue_payload_type=>'SYS.AQ$_JMS_TEXT_MESSAGE');
 DBMS_AQADM.CREATE_QUEUE(queue_name => 'Q', queue_table => 'QT');
 DBMS_AQADM.CREATE_QUEUE(queue_name => 'QD1', queue_table => 'QTD');
 DBMS_AQADM.CREATE_QUEUE(queue_name => 'QD2', queue_table => 'QTD');
 DBMS_AQADM.CREATE_QUEUE(queue_name => 'QD3', queue_table => 'QTD');
 DBMS_AQADM.START_QUEUE(queue_name => 'Q');
 DBMS_AQADM.START_QUEUE(queue_name => 'QD1');
 DBMS_AQADM.START_QUEUE(queue_name => 'QD2');
 DBMS_AQADM.START_QUEUE(queue_name => 'QD3');
 subscriber := sys.aq$_agent(NULL, 'QD1', NULL);
 DBMS_AQADM.ADD_SUBSCRIBER(queue_name => 'Q',subscriber => subscriber);
 subscriber := sys.aq$_agent(NULL, 'QD2', NULL);
 DBMS_AQADM.ADD_SUBSCRIBER(queue_name => 'Q',subscriber => subscriber);
 subscriber := sys.aq$_agent(NULL, 'QD3', NULL);
 DBMS_AQADM.ADD_SUBSCRIBER(queue_name => 'Q',subscriber => subscriber);
 DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name => 'Q', latency => 0);
END; 
于 2014-07-15T12:08:57.650 回答