如何将多个使用者oracle AQ队列加入常规队列?我究竟做错了什么?

问题描述

我试图为我们的应用程序开发排队机制。我的想法是准备一种标准解决方案,其中有一个应用程序(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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...