> 数据库 > Oracle >

orcale queue

下面给出oracle高级队列传递消息的一些说明,注意没有给出oracle高级队列传的消息传递,以及基于主题消息的通知/监听的相关东西,等我有空再补上。

1.高级队列操作(AQ)
参考资料
 Oracle9i Application Developer's Guide - Advanced Queuing
Release 1 (9.0.1)
 Oracle9i PL/SQL 从入门到精通
中国水利水电出版社 2002年5月 ISBN 7-5084-1055-6
1.1.创建对列消息的对象类型(Type)
定义一个对象类型。这个对象类型用于充当队列消息中的消息体。

create or replace type WDZAQMSG as object
-- Author : wdz
-- Created : 2003-11-19 13:49:03
-- Purpose : 消息队列类型
-- Attributes
id int,
name varchar2(200),
info varchar2(2000)
)


1.2.创建队列表
参考dbms_aqadm.create_queue_table
1.存储参数storage_clause 可以是 MAXTRANS,LOB等
2.sort_list 可以是PRIORITY,enq_time这2个参数或者其中一个。


具体可以察看对应的 队列表的数据结构。例如下面的例子
--创建队列表,'WDZAQTABLE' 队列表名,'WDZAQMSG'队列对象名(充当消息体的对象名称),以下同
dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG');
--创建具有排序功能的队列表
dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time');


3。消息分组
参数 message_grouping 可以是 NONE,或 TRANSACTIONAL
-- message grouping
dbms_aqadm.TRANSACTIONAL       CONSTANT BINARY_INTEGER := 1;
dbms_aqadm.NONE             CONSTANT BINARY_INTEGER := 0;
后者表示一个与事务相关的消息分成1组,在提取消息的时候可以当成一组相关消息来提取。
例如:
--创建带带分组功能的消息队列表
dbms_aqadm.create_queue_table('WDZGROUPAQTABLE','WDZAQMSG',
sort_list => 'PRIORITY,enq_time',
 message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/ );


4.multiple_consumers
表示消息接受者是否为多个用户。默认是只有1个接收者。如果要多个用户可以接受消息,需要设置=true
--创建多个接收者的消息队列表
dbms_aqadm.create_queue_table('WDZMUTIAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time',
 message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/
 ,multiple_consumers => true);

1.3创建队列
参考 dbms_aqadm.create_queue
--创建队列, 'WDZQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZQUEUE','WDZAQTABLE',queue_type => dbms_aqadm.NORMAL_QUEUE);
参数queue_type 表示队列是否为正常队列还是异常队列,
参数值为dbms_aqadm.NORMAL_QUEUE 或者dbms_aqadm.EXCEPTION_QUEUE

--创建多用户队列, 'WDZQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZMUTIQUEUE','WDZMUTIAQTABLE',
queue_type => dbms_aqadm.NORMAL_QUEUE);
--创建分组队列, 'WDZGROUPQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZGROUPQUEUE', 'WDZAQTABLE',
   queue_type => dbms_aqadm.NORMAL_QUEUE);

1.4创建非持久队列
非持久队列 顾名思义就是没有永久保存到数据的队列,队列只存在于系统的内存中。
参考 dbms_aqadm.create_np_queue
--创建队列, 'WDZQUEUE2' 为队列的名称,
dbms_aqadm. create_np_queue ('WDZQUEUE2', multiple_consumers=>false);
参数 multiple_consumers表示接收者是否为多用户接收
1.5启动一个队列
参考dbms_aqadm.start_queue
参数enqueue表示是否可以入队操作
参数dequeue表示是否可以入队操作

-- 启动一个队列,'WDZQUEUE' 为队列的名称1.6停止队列
参数的意思参考启动一个队列1.7普通的入队/出队操作
1.7.1.一个普通的消息发送/接收例子
1.消息发送2.消息接收1.7.2带有优先级别的消息发送接收例子
1.消息发送2.消息接收1.7.3消息浏览
1.消息发送2.消息接收

-- 目的,先浏览所有消息,找到指定消息后把这个消息删除1.9消息属性参数

type message_properties_t is record (
---消息优先级别 ,可以小于0 ,数字越小优先程度越高
 priority binary_integer default 1,
 ---消息在队列中的延迟时间,过了这个时间消息才可以出队
 --delay=NO_DELAY 消息不延迟,否者为延迟时间
 delay   binary_integer default NO_DELAY,
 --消息过期时间,expiration=NEVER,消息永远不过期
 expiration binary_integer default NEVER,
 ---消息发送方设置的标示符号
 correlation varchar2(128) default null,
 attempts binary_integer,
 --消息接收者列表
 recipient_list aq$_recipient_list_t,
 -- 异常队列名称,当消息不能处理,或者处理出错,消息被转移到这个队列,类似于jsp的错误页面
 exception_queue varchar2(51) default null,
 --消息进入队列的时间,由系统维护用户不能修改
 enqueue_time date,
 --发送方标识
 sender_id aq$_agent default null,
 --AQ消息传播用来说明来源
 original_msgid raw(16) default null);  
;
1.10消息接收者/订阅者
--消息接收者--消息接收者列表--消息订阅者列表类型---定义一个队列的注册列表1.11多用户队列的使用(订阅/发布模型)
1.多用户队列的使用,建立订阅者列表
---多用户队列的使用,建立订阅者列表2.消息发送
--消息的发送(发布/订阅模型)3.消息的接收
-- 发布/订阅模型 ,消息的接收--用户 apple 开始接收消息[/code]

1.12消息分组的使用

1.消息分组,消息的发送

--消息分组,消息的发送2.消息的接收

---消息分组,消息的接收1.7消息选项参数dbms_aq.dequeue_options_t

由于包dbms_aq是加密的,所以看不到dbms_aq. dequeue_options_t,现给出参数说明.

type dequeue_options_t is record {

 ---visibility指定消息入队时的事务行为,visibility=ON_COMMIT 说明生成的消息是
--当前事务的一部分
 --visibility=IMMEDIATE 消息立即进入队列,如果 操作的非持久队列,该参数必须等于这个值
 visibility binary_integer default ON_COMMIT ,
 ---relative_msgid 消息的标识和 参数 seqquence_deviation 配合使用,
--而且在 seqquence_deviation = BEFORE 才有效
 relative_msgid raw(16) default null,
 --seqquence_deviation 说明当消息进入队列的放置方式
 -- seqquence_deviation=null 放置到队尾
 --seqquence_deviation=TOP 放置到队头
 --seqquence_deviation=TOP 放置到指定消息 relative_msgid 的前面  
 seqquence_deviation binary_integer default null,
 ---transformation 指明消息进入队列前使用的转换函数
 transformation varchar2(60) default null
} (责任编辑:IT)