Я попытался разработать механизм очередей для нашего приложения. Моя идея состоит в том, чтобы подготовить стандартное решение, в котором есть одно приложение (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, 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;
Я написал этот код на основе единственного найденного примера: https://docs.oracle.com/cd/A87860_01/doc/appdev.817/a76938/adq_aex4.htm
Вроде неплохо, но, к сожалению, не работает. Я попытался немного напортачить с добавлением подписчиков и немного с планированием распространения. Ничего не помогло.
Я ожидаю, что это решение будет передавать сообщения из темы в очередь 1 и очередь 2, но сообщения не передаются. Они остаются в исходной очереди.
Что я делаю не так?