Reputation: 1595
I tried to develop queueing mechanism for our application. My idea is to prepare standard solution where there is one application (app0) producing events and one or more applications (app1, app2) which consume them. I need publisher/subscriber queue (topic), one queue for each consumer application and make regular queues subscribers of topic:
[app0] --enqueues-> [topic] <--subscribes-- [queue1] <--dequeues-- [app1]
<--subscribes-- [queue2] <--dequeues-- [app2]
I tried this:
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, queue_payload_type => 'SYS.AQ$_JMS_OBJECT_MESSAGE', 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, queue_payload_type => 'SYS.AQ$_JMS_OBJECT_MESSAGE', 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, null);
DBMS_AQADM.ADD_SUBSCRIBER(queue_name => v_queue_name_topic, subscriber => subscriber);
DBMS_AQADM.SCHEDULE_PROPAGATION(queue_name => v_queue_name_topic);
END;
I wrote this code based on the only one example I found: https://docs.oracle.com/cd/A87860_01/doc/appdev.817/a76938/adq_aex4.htm
It seems good, but unfortunately doesn't work. I tried to mess up a little bit with adding subscribers and a little bit with scheduling propagation. Nothing helped.
I expect this solution to pass messages from topic to queue1 and queue2, but messages are not passed. They stay in original queue.
What am I doing wrong?
Upvotes: 2
Views: 1320