OracleAQ的使用_第1页
OracleAQ的使用_第2页
OracleAQ的使用_第3页
OracleAQ的使用_第4页
OracleAQ的使用_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论