-1

如果有一些数据落在队列表中。如何通过在我的应用程序端获取通知来自动使消息出队。

下面是我关注的将消息排入队列表的链接,它成功发生。

http://www.oratechinfo.co.uk/aq.html

我可以在预定时间使用以下查询查看我在队列表中排队的消息。

 select user_data from queue_table;

下面是用于使消息出列的 C++ 代码的链接。使用下面的 C++ 代码,我可以在我的应用程序端手动出列数据。但我想要一种方法通过获取通知自动出列并开始自动出列。请帮我说清楚。

http://docs.oracle.com/cd/A83908_02/NT816EE/DOC/nt.816/a99999/o4c00069.htm

4

1 回答 1

1

我不知道这在 C 中是否可行,但是从 PL/SQL 中,您将创建一个具有以下签名的回调过程。

CREATE PROCEDURE demo_queue_callback_procedure(
                 context  RAW,
                 reginfo  SYS.AQ$_REG_INFO,
                 descr    SYS.AQ$_DESCRIPTOR,
                 payload  RAW,
                 payloadl NUMBER
                 ) AS

   r_dequeue_options    DBMS_AQ.DEQUEUE_OPTIONS_T;
  r_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
  v_message_handle     RAW(16);
  o_payload            demo_queue_payload_type;

开始

  r_dequeue_options.msgid := descr.msg_id;
  r_dequeue_options.consumer_name := descr.consumer_name;

  DBMS_AQ.DEQUEUE(
     queue_name         => descr.queue_name,
     dequeue_options    => r_dequeue_options,
     message_properties => r_message_properties,
     payload            => o_payload,
     msgid              => v_message_handle
     );

    -- Do something with the payload received.  Must commit to get message out of table.

       COMMIT;

结尾; /

-- 创建一个订阅者,并注册你的回调过程

   DBMS_AQADM.ADD_SUBSCRIBER (
      queue_name => 'demo_queue',
      subscriber => SYS.AQ$_AGENT(
                       'demo_queue_subscriber',
                       NULL,
                       NULL )
      );

   DBMS_AQ.REGISTER (
      SYS.AQ$_REG_INFO_LIST(
         SYS.AQ$_REG_INFO(
            'DEMO_QUEUE:DEMO_QUEUE_SUBSCRIBER',
            DBMS_AQ.NAMESPACE_AQ,
            'plsql://DEMO_QUEUE_CALLBACK_PROCEDURE',
            HEXTORAW('FF')
            )
         ),
      1
      );

您必须更改上述内容才能从错误队列中读取,但我认为概念是相同的。

于 2013-01-04T01:43:42.133 回答