Oracle AQ Demo,Step by Step
我准备用AQ来做一个数据仓库系统,提交分析任务队列。有以下需求:
1.利用通知异步的执行存储过程
2.设定队列大小极限
3.出列即删除
OK,let's go for it
step 1:创建用户
--create user
-- Create the user
create user PHS
identified by ""
default tablespace PHSDATA
temporary tablespace TEMP
profile DEFAULT;
-- 赋予AQ管理权限
grant execute on DBMS_AQ to PHS;
grant execute on DBMS_AQ_BQVIEW to PHS;
grant execute on Dbms_Aqadm to PHS;
-- Grant/Revoke role privileges
grant connect to PHS;
grant resource to PHS;
-- Grant/Revoke system privileges
grant create procedure to PHS;
grant create table to PHS;
grant create view to PHS;
grant unlimited tablespace to PHS;
step 2:创建一个队列载体对象,一个没有body的type
create or replace type task_c as object
(
-- Author : WANGWJ
-- Created : 2008-1-8 16:00:14
-- Purpose : infomation carrier for analyse Clone-PHS

-- Attributes 业务逻辑相关
begindate DATE,
enddate   DATE,
area   VARCHAR2(12),
taskid   NUMBER,
phscodex VARCHAR2(20)

-- Member functions and procedures

)
--创建队列表
begin
-- Call the procedure
sys.dbms_aqadm.create_queue_table(queue_table => 'QT_CLONE',
                queue_payload_type => 'task_c',--这就是我们定义的type
                sort_list => 'priority,enq_time',--按优先级和入列时间排序
                multiple_consumers => TRUE, --多消费者
                comment => 'queue for analyse CLONE-PHS',
                auto_commit => FALSE --手动控制事务--create queue
                );
end;
--创建队列
begin
sys.dbms_aqadm.create_queue(
queue_name => 'q_clone',
queue_table => 'qt_clone',--刚刚建立的queue表
queue_type => sys.dbms_aqadm.normal_queue,
max_retries => 3,--dequeue失败后重试次数
retry_delay => 1,--重试前等待
retention_time => 0 --dequeue后保持时间,不保持
);
end;
step 3:启动队列
execute dbms_aqadm.start_queue('q_clone',true,true);
step 4:创建消息订阅者
SQL> execute dbms_aqadm.add_subscriber ( queue_name => 'q_clone', subscriber => sys.aq$_agent
('analyst',null,null));
PL/SQL procedure successfully completed
SQL>
step 5:入列和出列测试
SQL> --入列
SQL> declare
2 v_Message task_c;
3 v_MsgId RAW(16);
4 v_options DBMS_AQ.ENQUEUE_OPTIONS_T;
5 v_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
6 v_Recipients DBMS_AQ.AQ$_RECIPIENT_LIST_T;
7 begin
8   v_Message:=task_c(begindate => SYSDATE,enddate => SYSDATE-1,area => '028',
9           taskid =>100,phscodex => 'test#$');
10   v_properties.priority := 1; --该消息的优先级别
11   v_options.visibility :=DBMS_AQ.IMMEDIATE;
12   dbms_aq.enqueue(queue_name => 'q_clone',enqueue_options => v_options,message_properties =>
v_properties,payload => v_Message,msgid => v_MsgId);
13   dbms_output.put_line('encode success,msgid is '||v_MsgId);
14
15 end;
16 /
PL/SQL procedure successfully completed
--入列成功
SQL> select t.q_name,t.msgid,t.priority from qt_clone t;
Q_NAME           MSGID               PRIORITY
------------------------------ -------------------------------- ----------
Q_CLONE           7466C75477954808B7E10BC50738845B     1
--改变 v_properties.priority的值为3,2,再入列两次,现在入列的先后顺序为1 3 2,我们希望的出列顺序
--为1 2 3
--出列
declare
v_Message task_c;
v_MsgId RAW(16);
v_options DBMS_AQ.DEQUEUE_OPTIONS_T;
v_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
v_Recipients DBMS_AQ.AQ$_RECIPIENT_LIST_T;
begin
--   v_Recipients(0) := sys.aq$_agent('NOTE','MTQ',0);
--   v_properties.recipient_list := v_Recipients;
v_options.visibility :=DBMS_AQ.IMMEDIATE;
v_options.consumer_name := 'analyst';
dbms_aq.dequeue(queue_name => 'q_clone',dequeue_options => v_options,message_properties =>
v_properties,payload => v_Message,msgid => v_MsgId);
dbms_output.put_line('decode success,msgid is '||v_MsgId);
dbms_output.put_line('subject is '||v_Message.area);
end;
--测试结果略,可以看出出列的顺序 1 2 3
step 6:创建测试过程,并注册通知
创建测试表
-- Create table 用于在接到通知的时候插入一条消息
create table TEST_AQ
(
INFO   VARCHAR2(100),
MESSAGE TASK_C
)
--创建测试过程,插入一条消息,并出列
create or replace procedure plsqlnotif
AS
v_Message task_c;
v_MsgId RAW(16);
v_options DBMS_AQ.DEQUEUE_OPTIONS_T;
v_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
v_Recipients DBMS_AQ.AQ$_RECIPIENT_LIST_T;
BEGIN
v_options.visibility :=DBMS_AQ.IMMEDIATE;
v_options.consumer_name := 'analyst';
dbms_aq.dequeue(queue_name => 'q_clone',dequeue_options => v_options,message_properties =>
v_properties,payload => v_Message,msgid => v_MsgId);
dbms_output.put_line('decode success,msgid is '||v_MsgId);
dbms_output.put_line('subject is '||v_Message.area);
INSERT INTO test_aq VALUES('Get message on ',v_Message);
END;
--注册
declare
reginfolist sys.aq$_reg_info_list;
begin
reginfolist := sys.aq$_reg_info_list(
sys.aq$_reg_info('phs.q_clone:analyst',
  DBMS_AQ.NAMESPACE_AQ,
  'plsql://phs.plsqlnotif', null));
dbms_aq.register(reginfolist, 1);
end;
step 7:测试情况
--入列 略
--接到通知后,插入test表,并出列
SQL> execute plsqlnotif;
decode success,msgid is 59578D93BD55477994D8C9C6B672242B
subject is 028
PL/SQL procedure successfully completed
SQL> select * from test_aq;
INFO                                   MESSAGE
-------------------------------------------------------------------------------- -------
Get message on

ORACLE_AQ 队列的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  3. Beanstalkd一个高性能分布式内存队列系统

    高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...

  4. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  5. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  8. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  9. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

随机推荐

  1. js数组转换成json串 (JSON.stringify)

    例如: var giftlist[1490011777] = []; giftlist[1490011777]['id'] = 1490011777; giftlist[1490011777]['na ...

  2. hnuun 11544 小明的烦恼——找字符串(求环形字符串的最小最大字典序)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11544&courseid=0 最小最大表示法: 求环 ...

  3. jquery控制Request Payload和Form Data

    Request Payload方式,会发起两次请求 Form Data只发起一次请求 若要把一个ajax请求改为Payload方式,设置contentType即可,发现请求参数不是对象,再把参数转换为 ...

  4. UEFI 下安装 ubuntu 及 win8 双系统 的一些事

    给电脑原装的win8系统装Ubuntu 出现了好多问题,重装多次,刷坏一块主板后,(都是泪啊...) 终于成功. 可能的问题 1:win8 系统下进入 blos 解决方案  1)关闭快速启动:管理员命 ...

  5. sql语句执行的很慢

    一个 SQL 执行的很慢,我们要分两种情况讨论: 1.大多数情况下很正常,偶尔很慢,则有如下原因 (1).数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘. (2).执行的时候,遇到锁, ...

  6. Git回退---reset和revert

    今天学习了git回退的两个命令,现在总结一下: 1.git reset 如果想回退错误的提交C和D,只要把指针移到B上 git reset --hard a0fvf8 而这时候,远程仓库的指针还在D上 ...

  7. Django学习系列之模板系统

    一.模板标签 if/else {%  if  %}标签检查一个变量的值是否为真或者等于另外一个值,如果为真,系统会执行{%  if  %}和{%  endif  %}之间的代码块,例如: {% if ...

  8. 【剑指Offer学习】【面试题65:滑动窗体的最大值】

    题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4 ...

  9. [翻译角]Headline English: A Captain Should Be Pitch Perfect at a Multitude of Skills (ESLPOD Blog)

    以下转自www.eslpod.com,翻译为本人添加.其余版权均归原网站所有. ESLPOD是一个英语学习网站,我最初知道这个网站,是因为“奶爸”<把你的英语用起来>(电子版3元)一书的推 ...

  10. ADB无法启动

    一般就是5037端口被占用,各种手机助手鼓捣的 1.CMD下查看端口是否被占用 netstat -ano|findstr "5037" 截图不上了,我的是820进程,360手机助手 ...