Как опубликовать сообщение в теме в очереди сообщений Oracle AQ из PL/SQL

Я знаю, что могу публиковать сообщения на заданную тему, используя JMS TopicPublisher из кода Java в очередь Oracle AQ (имеется множество документов и примеров), но мне действительно нужно также публиковать сообщения на заданную тему из кода PL/SQL для очереди Qracle AQ. Я не могу найти документацию или примеры того, как это сделать. Является ли это возможным? Может кто-нибудь указать мне правильную документацию или образец местоположения???

Любая помощь приветствуется,

Ян ван де Клок

1 ответ

Всю информацию с примерами вы можете найти в руководстве пользователя Streams Advanced Queuing.

Пример ниже был извлечен из документации с небольшими изменениями

    CREATE TYPE message_typ AS object(
       sender_id              NUMBER,
       subject                VARCHAR2(30),
       text                   VARCHAR2(1000));
    /


    BEGIN
       DBMS_AQADM.CREATE_QUEUE_TABLE(
          queue_table            => 'obj_qtab',
          queue_payload_type     => 'message_typ',
          multiple_consumers     => true
          );
    END;
    /

    BEGIN
       DBMS_AQADM.CREATE_QUEUE(
          queue_name         =>  'obj_queue',
          queue_table        =>  'obj_qtab');
    END;
    /

    BEGIN
       DBMS_AQADM.START_QUEUE (
          queue_name         => 'obj_queue');
    END;
    /

DECLARE
   subscriber         sys.aq$_agent;
BEGIN
   subscriber     :=  sys.aq$_agent('RED', NULL, NULL);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name  =>  'obj_queue',
      subscriber  =>  subscriber);

   subscriber     :=  sys.aq$_agent('GREEN', NULL, NULL);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name  =>  'obj_queue',
      subscriber  =>  subscriber); 

         subscriber     :=  sys.aq$_agent('YELLOW', NULL, NULL);
   DBMS_AQADM.ADD_SUBSCRIBER(
      queue_name  =>  'obj_queue',
      subscriber  =>  subscriber);

END;
/

Скрипт делает, создает объект, создает таблицу очередей, создает очередь, запускает очередь и регистрирует 3 подписчика.

DECLARE
   enqueue_options     DBMS_AQ.enqueue_options_t;
   message_properties  DBMS_AQ.message_properties_t;
   recipients          DBMS_AQ.aq$_recipient_list_t;
   message_handle      RAW(16);
   message             message_typ;

    recipients2          DBMS_AQ.aq$_recipient_list_t;
BEGIN
   message := message_typ(001, 'MESSAGE 1','For queue subscribers');
   DBMS_AQ.ENQUEUE(
      queue_name          => 'obj_queue',
      enqueue_options     => enqueue_options,
      message_properties  => message_properties,
      payload             => message,
      msgid               => message_handle);
-- Message for all subscriber

   message := message_typ(001, 'MESSAGE 2', 'For two recipients');
   recipients(1) := sys.aq$_agent('RED', NULL, NULL);
   recipients(2) := sys.aq$_agent('BLUE', NULL, NULL);
   message_properties.recipient_list := recipients;
   DBMS_AQ.ENQUEUE(
      queue_name          => 'obj_queue',
      enqueue_options     => enqueue_options,
      message_properties  => message_properties,
      payload             => message,
      msgid               => message_handle);
-- Message for RED,BLUE  subscriber   


   recipients2(1)   := sys.aq$_agent('RED', NULL, NULL);   
   message := message_typ(001, 'MESSAGE 3', 'For RED Subscriber');      
   message_properties.recipient_list := recipients2;
   DBMS_AQ.ENQUEUE(
      queue_name          => 'obj_queue',
      enqueue_options     => enqueue_options,
      message_properties  => message_properties,
      payload             => message,
      msgid               => message_handle);
-- Message for RED  subscriber   
   COMMIT;
END;
/

Чтобы проверить результат, вы должны запросить представление таблицы очередей (AQ$queue_table_name).
В этом случае это так.

select o.user_data,CONSUMER_NAME  from AQ$obj_qtab o order by MSG_ID;
Другие вопросы по тегам