我想在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视图。我有管理员权限。我应该在哪里寻找它?我该如何解决传播问题?
任何帮助都是真正的帮助!
答案 0 :(得分:2)
解决了!
如果目标队列(传播到的消息)是单用户队列,则用户名必须设置为NULL!这是我的问题。它记录在11g doc:
中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);
在发现问题时,下面的精彩故障排除指南非常有用:
第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;