【问题标题】:How to publish a message to a topic on an Oracle AQ message queue from PL/SQL如何从 PL/SQL 向 Oracle AQ 消息队列上的主题发布消息
【发布时间】:2018-05-14 09:11:04
【问题描述】:

我知道我可以使用 JMS TopicPublisher 从 Java 代码将消息发布到给定主题到 Oracle AQ 队列(有大量文档和示例),但我确实还需要从 PL/发布消息到给定主题Qracle AQ 队列的 SQL 代码。 我找不到有关如何执行此操作的文档或示例。可能吗?有人能给我指出正确的文档或示例位置吗???

感谢您的帮助,

扬·范·德·克洛克

【问题讨论】:

标签: oracle plsql publish advanced-queuing


【解决方案1】:

您可以在Streams Advanced Queuing User's Guide中找到所有带有示例的信息

下面的例子是从文档中提取的,有微小的变化

    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;

【讨论】:

  • 此示例与“主题”有何关联?我只想发布关于某个主题的消息。发送消息时,我不知道收件人。
  • 收件人应该只注册到主题并接收发布到该主题的所有消息。我在这里错过了什么吗???
  • 第一条语句 DBMS_AQ.ENQUEUE 向所有订阅者发送消息。如果队列没有订阅者,则会引发异常(没有消息的接收者)。要注册到主题(Topis = "obj_queue"),请使用 DBMS_AQADM.ADD_SUBSCRIBER 示例,DBMS_AQADM.REMOVE_SUBSCRIBER 取消注册
  • 好的,所以每个主题都有自己的队列。那是我丢失的部分信息!
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 2013-01-16
  • 2020-07-08
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 2018-02-05
  • 2014-03-29
相关资源
最近更新 更多