Oracle AQ是Oracle数据库中集成的一种消息队列机制,可以用于不同应用程序间的消息交互。

下面讲如何具体的实现。

1、为用户赋权

GRANT RESOURCE TO datatest;

GRANT CONNECT TO datatest;

GRANT EXECUTE ANY PROCEDURE TO datatest;

GRANT aq_administrator_role TO datatest;

GRANT aq_user_role TO datatest;

GRANT EXECUTE ON dbms_aqadm TO datatest;

GRANT EXECUTE ON dbms_aq TO datatest;

GRANT EXECUTE ON dbms_aqin TO datatest;

2、创建一个payload类型

payload数据载体,可以理解为运送货物的货车。出队列的数据都从这个创建的类型进行获取。

create or replace TYPE data_queue_payload_type AS OBJECT 
( /* TODO enter attribute and method declarations here */ 
ctype number,pid varchar2(200),ctime VARCHAR2(30)
)

3、创建队列表、队列、启动队列

create or replace PROCEDURE CREATE_DATA_AQ AS 
BEGIN

----创建队列表以允许多个消费者(consumers)
     DBMS_AQADM.CREATE_QUEUE_TABLE (
      queue_table        => 'data_queue_table',
      queue_payload_type => 'data_queue_payload_type',
      multiple_consumers => TRUE
      );
    ----创建队列
    DBMS_AQADM.CREATE_QUEUE (
      queue_name  => 'data_queue',
      queue_table => 'data_queue_table'
      );
     ---启动队列
     DBMS_AQADM.START_QUEUE (
      queue_name => 'data_queue'
      );
      
END CREATE_DATA_AQ;

4、消息入队列

本人在实际应用中使用的是触发器来进行入队列的操作,所以不需进行手动commit,如果是单独进行调用需要手动进行commit操作;

PROCEDURE input_queue(ctype number,pid varchar2,ctime VARCHAR2) AS
   r_enqueue_options      dbms_aq.enqueue_options_t;
        r_message_properties   dbms_aq.message_properties_t;
        v_message_handle       RAW(16);
        o_payload              data_queue_payload_type;
  BEGIN
    -- TODO: PROCEDURE DATA_AQ_DEAL.input_queue所需的实施
    --DBMS_OUTPUT.PUT_LINE(ctype||','||pid||','||ctime);   
     o_payload := data_queue_payload_type(ctype,pid,ctime);
     
        dbms_aq.enqueue(queue_name => 'data_queue', enqueue_options => r_enqueue_options, message_properties => r_message_properties
        , payload => o_payload, msgid => v_message_handle);
--commit; 
  END input_queue;

5、消息出队列

PROCEDURE data_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              data_queue_payload_type;
    BEGIN
    -- TODO: PROCEDURE DATA_AQ_DEAL.data_queue_callback_procedure所需的实施
        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);
    ---消息体 o_payload.ctype,o_payload.pid,o_payload.ctime 
     --消息处理程序
       data_deal.deal_data(o_payload.ctype, o_payload.pid, o_payload.ctime);
      
    END data_queue_callback_procedure;

6、通知

向队列增加一个订阅者(subsriber)并注册订阅者接到通知时的动作,这里接到通知时通过存储过程进行处理。

如下操作完成后,队列data_queue的consumer_name即为data_queue_subscriber

create or replace PROCEDURE DATA_SUBSCRIPT_AQ AS 
BEGIN
    DBMS_AQADM.ADD_SUBSCRIBER (
      queue_name => 'data_queue',
      subscriber => SYS.AQ$_AGENT(
                       'data_queue_subscriber',
                       NULL,
                       NULL )
      );
    DBMS_AQ.REGISTER (
       SYS.AQ$_REG_INFO_LIST(
          SYS.AQ$_REG_INFO(
             'data_queue:data_queue_subscriber',
             DBMS_AQ.NAMESPACE_AQ,
             'plsql://DATA_AQ_DEAL.data_queue_callback_procedure',
             HEXTORAW('FF')
             )
          ),
       1
       );
END DATA_SUBSCRIPT_AQ;

oracle 高级队列Advanced Queuing(AQ) 通过消息通知自动异步出列相关推荐

  1. Oracle 高级队列(AQ) 与JAVA JMS

    Oracle 高级队列AQ与JAVA JMS Oracle 高级队列是什么? 高级队列Advanced Queuing(AQ).它是oracle原生消息软件,这篇文章提供了一个AQ的高级概览.尤其是我 ...

  2. Oracle高级队列介绍

    原始链接:http://www.oracle-developer.net/display.php?id=411 oracle高级队列介绍 高级队列Advanced Queuing(AQ)在oracle ...

  3. ORACLE高级消息队列AQ

    业务场景:Oracle的A库中的一张表里面实时的数据插入需要调用另外一个服务去拿这个数据并进行系列计算 目前方案是:定时去取数据(缺点:实时性不高) 理想方案:被动触发另外一个服务去取(Oracle ...

  4. Linux进程间通信--消息队列(Message queuing)

    今天我们来谈一谈Linux进程间通信的方式之一消息队列 我们先来看看关于消息队列的定义: 1.消息队列是消息的链表,存放在内核中并由消息队列标识符表示. 2.消息队列提供了一个从一个进程向另一个进程发 ...

  5. 浅谈消息队列及常见的分布式消息队列中间件

    背景 分布式消息队列中间件是是大型分布式系统不可缺少的中间件,通过消息队列,应用程序可以在不知道彼此位置的情况下独立处理消息,或者在处理消息前不需要等待接收此消息.所以消息队列主要解决应用耦合.异步消 ...

  6. qt使用消息队列服务器,qt代码实现消息队列通信

    qt代码实现消息队列通信 内容精选 换一换 模式介绍:命令模式(command)命令模式的解释如下:向对象发送一个请求,但是并不知道该请求的具体接收者是谁,具体的处理过程是如何的,只知道在程序运行中指 ...

  7. Java架构之消息队列 (一):消息队列的概述

    消息队列系列分享大纲: 一.消息队列的概述 二.消息队列之RabbitMQ的使用 三.消息队列之Kafka的使用 四.消息队列之RabbitMQ的原理详解 五.消息队列之Kafka的原理详解 六.消息 ...

  8. oracle高级复制同步复制配置步骤

    ***业务需要,先做个高级复制的(同步复制).详细的说明如下:*** [Oracle] oracle高级复制同步复制配置步骤 首先,数据库要具备高级复制功能(用system身份登录数据库,查看v$op ...

  9. Oracle高级复制的同步复制的配置步骤说

    以下的文章主要讲述的是Oracle高级复制的同步复制,如果你需要在全国的几个相关地方来架设相关服务器(Oracle),其要求是各个相关的DB数据的一致,以下就是具体方案的描述,希望在你今后的学习中会有 ...

最新文章

  1. C++ const 理解
  2. c#.net配置mysql数据库连接池_C#MySQL连接池
  3. 蓝牙模块怎么指定查询另一个蓝牙模块_拆解报告:亚马逊10.or Buds真无线蓝牙耳机...
  4. $.each()与$(selector).each()
  5. Ubuntu编译开源卡丁车(supertuxkart)项目
  6. IP组播之组管理协议IGMP
  7. 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。(C++实现,非常简单明了)
  8. Java使用mysql游标_Mysql游标使用
  9. ## 作为多目标优化的多任务学习:寻找帕累托最优解+组合在线学习:实时反馈玩转组合优化-微软研究院+用于组合优化的强化学习:学习策略解决复杂的优化问题
  10. iphone6 计算机无法检测到照相机,iphone6手机照相不聚焦
  11. 深度学习——激活函数(激励函数)理论学习
  12. 传奇客户端wil和pak文件的目录与作用
  13. 虹科AR智能眼镜是什么?好用吗?
  14. DedeCMS 标签使用方法汇总!
  15. C语言生成n个随机坐标,c语言如何生成随机数 怎样用c语言生成n个随机数?
  16. micropython esp8266教程_ESP8266 Micropython – 连接大学Wi-Fi(WPA2 Enterprise PEAP)
  17. 【JS数据结构与算法】双向链表(DoublylinkedList)封装及其方法
  18. fMRI数据分析处理原理及方法fMRI数据分析处理原理及方法
  19. vue.js bootstrap 下拉列表_Excel下拉菜单制作的小技巧
  20. 计算机类专业工程认证,我校计算机科学与技术、测绘工程专业通过中国工程教育专业认证...

热门文章

  1. QT笔记第0篇__Qt基本介绍
  2. 186Echarts - 日历坐标系(Calendar Pie)
  3. ldapsearch 的用法
  4. python语句结尾为何不用分号_Python 不用分号作终止符?为什么
  5. 从前慢-深入理解JVM-篇章3
  6. HGD处理对抗样本以防御对抗攻击
  7. centos mysql双机备份_[原创]CentOS下Mysql双机互为备份
  8. 【天赢金创】Reflux学习指南
  9. 无人机项目跟踪记录八十----陀螺仪电路详解
  10. carla学习笔记2 传感器和数据