




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle AQ 的使用()随着不同应用模块间的消息交互和通信成为一个关键的功能,并且变得越来越重要。Oracle引入了一种强大的队列机制,通过它程序间可以实现信息的交互,oracle把它称作为AQ - Advanced Queuing. 使用Oracle AQ,我们不需要安装额外的中间件,它是Oracle数据库的一个功能组件,只要你安装了Oracle 数据库就可以使用AQ了。接下来分两部分来介绍AQ的使用,使用之前我们要创建QUEUE.我们创建一个自己的AQ的管理角色 my_aq_adm_role 和管理用户aqadm,再把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和一些基本操作需要的系统权限授权给 my_aq_adm_roleCREATE 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 = 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角色授权给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是任何消息都使用的一种数据类型和结构). 上面做的工作都需要在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_table,然后启动queue,这样我们就可以使用了。1.PL/SQL中使用AQ和java使用oracle本地AQ点对点模型(The Point-to-point Model)在简单的系统中,我们可以认为两个系统一起使用一个或多个Queue。这种方法我们称作点对点模型。把消息输入到queue中的过程称为入列(Enqueue)相反的过程称为出列(Dequeue)。一条消息一次只能被一个使用这个queue的应用系统Dequeue,当其他应用系统可以浏览这个queue。这种模式就是点对点模式(the point-point Model)PL/SQL中使用AQ使用aquser连接到数据库CONNECT aquser/aquser现在我们Enqueue一条消息.DECLAREqueue_optionsDBMS_AQ.enqueue_options_t;message_properties DBMS_AQ.message_properties_t;message_idRAW(16);my_messageaqadm.queue_message_type;BEGINmy_message := aqadm.queue_message_type(1,This is a sample message,This 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;/我们现在Dequeue刚才入列的消息,先执行SET SERVEROUTPUT ON然后DECLAREqueue_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,message_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);END;/上面的PL/SQL的例子比较简单和直接,任何应用和编程环境都可以这样做。然而实际项目中,可能用编程语言来处理消息会更便利和更有实用价值。接下来我们将讨论在java中使用AQJava 中使用Oracle Native AQ在前面的例子里我们为队列消息创建了一个Oracle Object type queue_message_type,在java语言中我们不能使用Oracle的数据类型,因此我们要创建一个和queue_message_type对应的java类。我们可以使用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 JDBC 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.setAutoCommit(false);然后我们通过传入AQ connection来获取AQ session对象/loads the Oracle AQ driver Class.forName(oracle.AQ.AQOracleDriver;aq.session = AQDriverManager.createAQSession(aq.connection);上述工作做好后,我们可以获取我们需要的queue对象了,进行出列的操作。AQQueue queue = aq.session.getQueue(aqadm,MESSAGE_QUEUEAQDequeueOption dequeueOption = new AQDequeueOption();System.out.println(Waiting for message to dequeue.;AQMessage message = (AQOracleQueue)queue).dequeue(dequeueOption,QUEUE_MESSAGE_TYPE.getFactory();把raw payload 转换成我们消息类型AQObjectPayload payload = message.getObjectPayload();QUEUE_MESSAGE_TYPE messageData = (QUEUE_MESSAGE_TYPE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阳山小学考试试卷及答案
- 2.2任务二花卉的分株繁殖 说课稿 2024-2025学年浙教版初中劳动技术七年级下册
- 2025年滨州市实验小学六年级第二十三单元测试数学试卷新课
- 成人经口气管插管机械通气患者口腔护理
- 2025年起重机械指挥证模拟考试题库及答案
- 2025年高考生物试题分类汇编体液调节(解析版)
- 人工智能应用基础 课件 项目4 人工智能开发与技术应用
- 2025年山东省青岛市中考化学试题(解析版)
- 2025购物中心省级区域代理合同
- 小班图形规律题目及答案
- 人美版美术七年级上册第二单元《第2课 心灵的色彩》教学设计
- 舞蹈家长会课件
- 2024-2025学年中职历史世界历史高教版(2023)教学设计合集
- 基本公共卫生健康教育服务村医培训课件
- 【完整打印版】教科版小学科学四年级上册教案(表格)
- 港珠澳大桥总体设计及关键技术-课件
- NB-T 10435-2020 电动汽车快速更换电池箱锁止机构通.用技术要求
- gcp机构办公室工作计划
- 1.1.3茶云纹叶枯病识别与防治
- (新版)光伏产业技能竞赛理论试题库及答案(浓缩500题)
- (2024年)公路工程工地试验检测培训课件
评论
0/150
提交评论