问题描述
我试图为我们的应用程序开发排队机制。我的想法是准备一种标准解决方案,其中有一个应用程序(app0)生成事件,而一个或多个应用程序(app1,app2)消耗事件。 我需要发布者/订阅者队列(主题),每个消费者应用程序需要一个队列,并使主题的常规队列订阅者成为
[app0] --enqueues-> [topic] <--subscribes-- [queue1] <--dequeues-- [app1]
<--subscribes-- [queue2] <--dequeues-- [app2]
我尝试过:
DECLARE
subscriber sys.aq$_agent;
v_queue_name_topic VARCHAR2(200) := 'my_topic';
v_queue_name_consumer_1 VARCHAR2(200) := 'my_consumer_1';
v_queue_name_consumer_2 VARCHAR2(200) := 'my_consumer_2';
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 't_' || v_queue_name_topic,queue_payload_type => 'SYS.AQ$_JMS_OBJECT_MESSAGE',multiple_consumers => true);
DBMS_AQADM.CREATE_QUEUE (queue_name => v_queue_name_topic,queue_table => 't_' || v_queue_name_topic);
DBMS_AQADM.START_QUEUE (queue_name => v_queue_name_topic);
DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 't_' || v_queue_name_consumer_1,multiple_consumers => false);
DBMS_AQADM.CREATE_QUEUE (queue_name => v_queue_name_consumer_1,queue_table => 't_' || v_queue_name_consumer_1);
DBMS_AQADM.START_QUEUE (queue_name => v_queue_name_consumer_1);
DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 't_' || v_queue_name_consumer_2,multiple_consumers => false);
DBMS_AQADM.CREATE_QUEUE (queue_name => v_queue_name_consumer_2,queue_table => 't_' || v_queue_name_consumer_2);
DBMS_AQADM.START_QUEUE (queue_name => v_queue_name_consumer_2);
subscriber := sys.aq$_agent('Consumer1',v_queue_name_consumer_1,null);
DBMS_AQADM.ADD_SUBSCRIBER(queue_name => v_queue_name_topic,subscriber => subscriber,queue_to_queue => true);
subscriber := sys.aq$_agent('Consumer2',v_queue_name_consumer_2,subscriber => subscriber);
DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name => v_queue_name_topic);
END;
我根据发现的唯一一个示例编写了此代码:https://docs.oracle.com/cd/A87860_01/doc/appdev.817/a76938/adq_aex4.htm
这看起来不错,但不幸的是它没有用。我试图通过添加订户来一点点弄乱,而通过调度传播来一点点弄乱。没有任何帮助。
我希望此解决方案将消息从主题传递到队列1和队列2,但消息不会传递。他们留在原来的队列中。
我在做什么错了?
解决方法
可能是因为您使用的是非常老的文档来创建队列。甲骨文现在已经达到20分。现在市场上的是19c。请使用以下文档作为参考。
点击here