OracleAQ的使用_第1頁
OracleAQ的使用_第2頁
OracleAQ的使用_第3頁
OracleAQ的使用_第4頁
OracleAQ的使用_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Oracle AQ 的使用() 隨著不同應用模塊間的消息交互和通信成為一個關鍵的功能, 并且變得越來越重要。 Oracle 引入了一種強大的隊列機制,通過它程序間可以實現(xiàn)信息的交互, oracle 把它稱作為 AQ - Advanced Queuing. 使用 Oracle AQ ,我們不需要安裝額外的中間件,它是 Oracle 數(shù)據(jù)庫 的一個功能組件,只要你安裝了 Oracle 數(shù)據(jù)庫就可以使用 AQ 了。接下來分兩部分來介紹 AQ 的使用,使用之前我們要創(chuàng)建 QUEUE.我們創(chuàng)建一個自己的 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創(chuàng)建一個用戶的角色 "my_aq_user_role" 和 普通用戶 "aquser" , 再把 Oracle AQ 的用戶角 色 "aq_user_role" 和一些基本操作需要的系統(tǒng)權限授權給 "

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');現(xiàn)在我們創(chuàng)建 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 創(chuàng)建普通用戶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 是任何消息都使用的一種數(shù)

6、據(jù)類型和結構 ).上面做的工作都需要在 DBA 的權限下做,現(xiàn)在我們切換到 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;我們 再創(chuàng) 建 一個 叫 "message_queue" 的 queue 以 及相 應 的 queue table "queue_message_tab

7、le", 然后啟動 queue ,這樣我們就可以使用了。1.PL/SQL 中使用 AQ 和 java 使用 oracle 本地 AQ點對點模型 (The Point-to-point Model)在簡單的系統(tǒng)中,我們可以認為兩個系統(tǒng)一起使用一個或多個 Queue 。這種方法我們稱作 點對點模型。把消息輸入到 queue 中的過程稱為入列 (Enqueue) 相反的過程稱為出列 (Dequeue) 。一條消息一次只能被一個使用這個 queue 的應用系統(tǒng) Dequeue ,當其他應用 系統(tǒng)可以瀏覽這個 queue 。這種模式就是點對點模式 (the point-point Model)

8、PL/SQL 中使用 AQ 使用 aquser 連接到數(shù)據(jù)庫 CONNECT aquser/aquser 現(xiàn)在我們 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;/我們現(xiàn)在 De

10、queue 剛才入列的消息,先執(zhí)行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 的例子比較簡單和直接, 任何應用和編程環(huán)境都可以這樣做。 然而實際項目 中,可能用編程語言來處理消息會更便利和更有實用價值。接下來我們將討論在 java 中使 用 AQJava 中使用 Oracle Native AQ在前面的例子里我們?yōu)殛犃邢?chuàng)建了一個Oracle Object type "queue_message_type",在java 語 言 中 我 們 不 能 使 用 Oracle 的 數(shù) 據(jù) 類 型 , 因 此 我 們 要 創(chuàng) 建 一 個 和 "queue_message_type" 對應的 java 類。我

13、們可以使用 Oracle Jpublisher, 通過它,我們可 以創(chuàng)建一個和 Oracle Object type 對應的 java 類。 (這里就不具體討論 JPublisher 用法 )這里我們用 JPubisher 創(chuàng)建一個和 Oracle Object type "queue_message_type" 對應 java class "QUEUE_MESSAGE_TYPE "在使用 Oracle Native AQ 對 java 的 interface 之前,我們必須通過 jdbc 連接到數(shù)據(jù)庫,代 碼如下/loads the Oracle JD

14、BC driverClass.forName("oracle.jdbc.driver.OracleDriver" ;NativeAQ aq = new NativeAQ();/DB connection, HOST - 數(shù)據(jù)庫所在的機器 domian id SID 數(shù)據(jù)的 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論