C++ 如何通过在应用程序端获取通知来自动将消息出列

C++ 如何通过在应用程序端获取通知来自动将消息出列,c++,oracle,stored-procedures,oracle10g,oracle11g,C++,Oracle,Stored Procedures,Oracle10g,Oracle11g,如果队列表中有一些数据。如何通过在我的应用程序端获取通知自动将消息出列 下面是我为将消息排队到队列表中而遵循的链接,它成功地发生了 我可以通过以下查询在计划时间看到我在队列表中排队的消息 select user_data from queue_table; 下层是C++代码的链接,可以将消息排队。在下面的C++代码中,我可以在我的应用程序中手动地将数据排队。但是我希望通过通知自动开始自动排队,然后自动退出队列。请帮我一个忙,把它弄清楚。< /P> 我不知道这在C语言中是否可行,但是从PL/

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

下面是我为将消息排队到队列表中而遵循的链接,它成功地发生了

我可以通过以下查询在计划时间看到我在队列表中排队的消息

 select user_data from queue_table;

下层是C++代码的链接,可以将消息排队。在下面的C++代码中,我可以在我的应用程序中手动地将数据排队。但是我希望通过通知自动开始自动排队,然后自动退出队列。请帮我一个忙,把它弄清楚。< /P>


我不知道这在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;
开始

结束; /

--创建订阅服务器,并注册回调过程

   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
      );

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

我不知道如果队列中有内容,它将如何以这种方式自动退出队列?因为您正在通过调用DBMS_AQ.Register将存储过程注册为处理程序。然后,每次消息在队列中时都会调用此过程。请参阅以下连结:
   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
      );