下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Oracle AQ 的使用() 随着不同应用模块间的消息交互和通信成为一个关键的功能, 并且变得越来越重要。 Oracle 引入了一种强大的队列机制,通过它程序间可以实现信息的交互, oracle 把它称作为 AQ - Advanced Queuing. 使用 Oracle AQ ,我们不需要安装额外的中间件,它是 Oracle 数据库 的一个功能组件,只要你安装了 Oracle 数据库就可以使用 AQ 了。接下来分两部分来介绍 AQ 的使用,使用之前我们要创建 QUEUE.我们创建一个自己的 AQ 的管理角色 "my_aq_adm_role" 和管理用户 "aq
2、adm" ,再把 Oracle AQ 管理角色 "aq_adminstrator_role" 授权给 "my_aq_adm_role".CREATE ROLE my_aq_adm_role;GRANT aq_adminsistator_role TO my_aq_adm_role创建一个用户的角色 "my_aq_user_role" 和 普通用户 "aquser" , 再把 Oracle AQ 的用户角 色 "aq_user_role" 和一些基本操作需要的系统权限授权给 "
3、my_aq_adm_role"CREATE ROLE my_aq_user_role;GRANT CREATE session, aq_user_role TO my_aq_user_role;EXEC DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(privilege => 'ENQUEUE_ANY',grantee => 'my_aq_user_role',admin_option => FALSE);EXEC DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(privilege =>
4、'DEQUEUE_ANY',grantee => 'my_aq_user_role',admin_option = 'FALSE');现在我们创建 AQ 管理用户CREATE USER aqadm IDENTIFIED BY aqadmDEFAULT TABLESPACE elathenTEMPORARY TABLESPACE temp;GRANT my_aq_adm_role TO aqadm;GRANT connect, resource TO aqadm; 注意, resource 角色一定要授给 user, 如果resource 角
5、色授权给my_aq_adm_role, user 将会失去 unlimited tablespace 权限接着为我们下面 example 创建普通用户CREATE USER aquser IDENTIFIED BY aquserDEFAULET TABLESPACE elathenTEMPORARY TABLESPACE temp;GRANT my_aq_user_role TO aquser;我们将在我们第一个 queue 中使用 object type 而不是 NUMBER or VARCHAR2 作为 payload ,这使我们更贴近实际应用。 (payload 是任何消息都使用的一种数
6、据类型和结构 ).上面做的工作都需要在 DBA 的权限下做,现在我们切换到 AQ 管理员CONNECT aqadm/aqadmCREATE TYPE queue_message_type AS OBJECT(no NUBER, title VARCHAR2(30),text VARCHAR2(2000);/GRANT EXECUTE ON queue_message_type TO my_aq_user_role;我们 再创 建 一个 叫 "message_queue" 的 queue 以 及相 应 的 queue table "queue_message_tab
7、le", 然后启动 queue ,这样我们就可以使用了。1.PL/SQL 中使用 AQ 和 java 使用 oracle 本地 AQ点对点模型 (The Point-to-point Model)在简单的系统中,我们可以认为两个系统一起使用一个或多个 Queue 。这种方法我们称作 点对点模型。把消息输入到 queue 中的过程称为入列 (Enqueue) 相反的过程称为出列 (Dequeue) 。一条消息一次只能被一个使用这个 queue 的应用系统 Dequeue ,当其他应用 系统可以浏览这个 queue 。这种模式就是点对点模式 (the point-point Model)
8、PL/SQL 中使用 AQ 使用 aquser 连接到数据库 CONNECT aquser/aquser 现在我们 Enqueue 一条消息 . DECLARE queue_optionsDBMS_AQ.enqueue_options_t;message_properties DBMS_AQ.message_properties_t;RAW(16);my_messageaqadm.queue_message_type;BEGINmy_message := aqadm.queue_message_type(1,'This is a sample message','Thi
9、s message has been posted on' | to_char(SYSDATE,'DD.MM.YYYY HH24:MI:SS');DBMS_AQ.enqueue(queue_name => 'aqadm.message_queue', enqueue_options => queue_options, message_properties => message_properties, payload => my_message, msgid => message_id);COMMIT;END;/我们现在 De
10、queue 刚才入列的消息,先执行SET SERVEROUTPUT ON然后DECLARE queue_options DBMS_AQ.DEQUEUE_OPTIONS_T;message_properties DBMS_AQ.MESSAGE_PROPERTIES_T; message_id RAW(2000);my_message aqadm.queue_message_type;BEGINDBMS_AQ.DEQUEUE( queue_name => 'aqadm.message_queue', dequeue_options => queue_options, m
11、essage_properties => message_properties, payload => my_message, msgid => message_id );COMMIT;DBMS_OUTPUT.PUT_LINE( 'Dequeued no: ' | my_message.no);DBMS_OUTPUT.PUT_LINE( 'Dequeued title: ' | my_message.title);DBMS_OUTPUT.PUT_LINE('Dequeued text: ' | my_message.text);
12、END;/上面的 PL/SQL 的例子比较简单和直接, 任何应用和编程环境都可以这样做。 然而实际项目 中,可能用编程语言来处理消息会更便利和更有实用价值。接下来我们将讨论在 java 中使 用 AQJava 中使用 Oracle Native AQ在前面的例子里我们为队列消息创建了一个Oracle Object type "queue_message_type",在java 语 言 中 我 们 不 能 使 用 Oracle 的 数 据 类 型 , 因 此 我 们 要 创 建 一 个 和 "queue_message_type" 对应的 java 类。我
13、们可以使用 Oracle Jpublisher, 通过它,我们可 以创建一个和 Oracle Object type 对应的 java 类。 (这里就不具体讨论 JPublisher 用法 )这里我们用 JPubisher 创建一个和 Oracle Object type "queue_message_type" 对应 java class "QUEUE_MESSAGE_TYPE "在使用 Oracle Native AQ 对 java 的 interface 之前,我们必须通过 jdbc 连接到数据库,代 码如下/loads the Oracle JD
14、BC driverClass.forName("oracle.jdbc.driver.OracleDriver" ;NativeAQ aq = new NativeAQ();/DB connection, HOST - 数据库所在的机器 domian id SID 数据的 service nameaq.connection = DriverManager.getConnection("jdbcracle:thin:HOST:1521:SID","aquser","aquesr"/aq.connection.setA
15、utoCommit(false);然后我们通过传入 AQ connection 来获取 AQ session 对象/loads the Oracle AQ driverClass.forName("oracle.AQ.AQOracleDriver" aq.session = AQDriverManager.createAQSession(aq.connection);上述工作做好后,我们可以获取我们需要的 queue 对象了 ,进行出列的操作。AQQueue queue = aq.session.getQueue("aqadm","MESSAG
16、E_QUEUE"AQDequeueOption dequeueOption = new AQDequeueOption();System.out.pri ntln ("Wait ing for message to dequeue."AQMessage message =(AQOracleQueue)queue).dequeue(dequeueOption,QUEUE_MESSAGE_TYPE.getFacto ry();把 raw payload 转换成我们消息类型AQObjectPayload payload = message.getObjectPayload();QUEUE_MESSAGE_TYPEmessageData= (QUEUE_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育馆环境卫生承诺书
- 2024年研发设计与技术咨询协议3篇
- 证券公司投资资产管理
- SP馆租赁合同模板
- 铁路轨道施工安全合同
- 设计工作室隔断租赁协议
- 跨境支付项目澄清函参考模板
- 环保行业污染防治培训费管理办法
- 能源利用评审员管理办法
- 机场化粪池改造工程合同
- 脊柱区1教学讲解课件
- KK5-冷切锯操作手册-20151124
- 教你炒红炉火版00缠论大概
- 消防管道施工合同
- 大学生计算与信息化素养-北京林业大学中国大学mooc课后章节答案期末考试题库2023年
- 2023年国开大学期末考复习题-3987《Web开发基础》
- 《骆驼祥子》1-24章每章练习题及答案
- 国际金融课后习题答案(吴志明第五版)第1-9章
- 《基于杜邦分析法周大福珠宝企业盈利能力分析报告(6400字)》
- 全国英语等级考试三级全真模拟试题二-2023修改整理
- 02R112 拱顶油罐图集
评论
0/150
提交评论