夏凌云,龔文濤
基于存儲過程和HTTP協議的消息主動推送系統實現
夏凌云,龔文濤
數據庫中的存儲過程和觸發器多用于數據完整性檢測和復雜規則約束,其提供了一個當數據表數據發生變更后的主動操作機制,Oracle數據庫還提供了UTL_HTTP包來實現數據庫對外部WEB服務器的主動訪問。利用這兩個特性,可以在數據發生變化的時候主動地將變化內容及時傳輸給外部業務服務器,再通過業務服務器發送給相應的業務人員,以此避免外部業務系統主動和頻繁讀取數據庫服務器,提高系統消息發送效率,降低系統查詢負擔。
存儲過程;觸發器;消息推送;Oracle;UTL_HTTP
隨著高校信息化建設發展和個人智能終端越來越普及,移動化學習和辦公逐漸成為趨勢,需要向師生用戶的移動終端主動推送消息或提醒的應用和場景也越來越多。在以往的使用過程中,主動推送的消息一般采用應用內推送的方式,在各個業務系統的APP端獨立推送,以保證推送的及時性。但是隨著高校信息化建設情況的發展,這種模式也顯現出了一些弊端,主要是需要推送消息的 APP會越來越多,用戶安裝起來比較復雜和混亂,也不符合統一門戶和入口的高校信息化移動建設要求。
現在很多高校比較常用的是將一些應用和消息推送功能統一集成到微信公眾平臺或者QQ公眾平臺上,通過這些公共平臺進行校園信息化功能的消息推送和用戶交互。使用這樣的第三方獨立平臺來進行消息推送在解決了老問題的時候又帶來了新問題,由于校內的信息化系統消息接口并不統一,致使第三方公共平臺的后臺服務器很多情況下不得不對各個系統消息接口進行定時輪詢,以確定是否有新消息和發送目標。而每個系統需要推送的消息、目標用戶往往非常多,消息也往往不是內容完全相同的群發消息。在這種情況下對每個業務系統的輪詢將消耗后臺服務器和業務系統服務器太多的資源,給整個校園信息化系統帶來很大的負擔。經過不斷探索,我們發現采用數據庫自帶的存儲過程和高級接口,并結合通用HTTP協議來實現消息的主動推送,在用來替代輪詢過程和減輕系統負擔上有著很好的效果。
存儲過程是一種重要的數據庫對象,一般由SQL語句組合而成,具有在存儲過程中聲明和設置的SQL變量、實現流程控制、處理異常,能夠對數據進行更新、讀取和刪除操作并返回結果集的功能[1]。一般來說,SQL語句每次提交執行一次就需要編譯一次,而存儲過程在創造時經過一次編譯后,可以將編譯結果保存在數據庫中以便反復調用,因此具有較高的執行效率。同時,存儲過程還可以降低整個應用程序的復雜性,具有可移植性、重用性、安全性和伸縮性等特性。因此,使用存儲過程操作數據庫可以有效地提高數據
庫應用的實現效率[2]。
觸發器是一種特殊類型的存儲過程,顧名思義,它是由某個數據庫事件的發生而被自動隱式調用的一種存儲過程。除了在一些數據庫系統事件里觸發的系統觸發器,數據庫系統中最常用的是DML(Data Manipulation Language 數據操控語言)觸發器,在我們的消息主動推送系統實現中采用的也是DML觸發器。觸發器主要由觸發對象、觸發事件、觸發事件和觸發頻率等等元素組成,細節如圖1所示:

圖1 觸發器組成
我們可以這樣簡要地理解觸發器工作過程:在數據庫中編譯成功并保存的觸發器,會一直監測著其設置的觸發對象(某個表、視圖或其它數據庫對象),當在該對象上發生指定的觸發事件(數據插入、 更新、刪除或其它數據庫事務)時,將在該觸發事件被執行前或執行后(由觸發時機指定),以指定的觸發頻率(語句級:每句SQL指令調用一次;行級:每影響一行數據調用一次)來執行觸發器中所設置的一系列指令操作。
總體設計如圖2所示:

圖2 系統總體設計
從上所述我們可以看出,觸發器可以由一個數據庫事件啟動,在某個具體的數據庫事件發生時自動后臺運行。結合我們的需求,當我們需要主動提醒的數據每次插入到數據表中的同時,我們都可以利用觸發器在數據庫中觸發一系列指定操作的運行,現在的問題就是如何使這一系列觸發操作能傳遞到數據庫外部的其它服務器中。以Oracle數據庫軟件為例,其提供了 UTL_HTTP包[3],用以實現數據庫事務對外部WEB服務器的HTTP訪問與互聯。
編寫一個行觸發器監視通知提醒數據表,當每有一行新通知插入到該表的時候,觸發器被觸發并調用預先編譯好的存儲過程,使用UTL_HTTP包將具體消息發送到外部WEB服務器,外部服務器接收到消息后再對用戶進行相應的消息具體推送。可以看出,在如此設計思路充分利用了數據庫的觸發器機制,外部服務器再不需要對數據庫進行定時輪詢,在大大降低了雙邊系統的負載的同時,還消除了輪詢時間間隔,使消息推送更加的及時。
在這里我們以實現將校園門戶中的待辦事項提醒推送到微信企業號的通知消息中為例,介紹整個流程的具體實現方法。假設所有用戶的新增待辦事項都被業務系統插入到數字校園公共數據庫用戶CORE_iUPC的TODO_INFO表中,我們需要通過行觸發器調用一段存儲過程,將該插入數據的具體內容(代辦人員和待辦事項)通過HTTP協議主動推送到微信企業號后臺服務器。本系統示例中的數據庫軟件為Oracle 11g RAC,存儲過程和觸發器[4]采用PL/SQL編寫[5],HTTP端代碼采用C#編寫,使用IIS7.0發布WEB服務。
3.1 觸發器設計觸發器的PL/SQL的代碼如下,具體含義見注釋:

3.2 存儲過程設計
存儲過程SendNotice的代碼如下,該存儲過程的重點是在調用oracle所提供的utl_http包來訪問HTTP服務,賦予該存儲過程HTTP Client的角色和功能,具體含義見注釋:


在這里為了簡要演示UTL_HTTP的調用方法,我們使用其來調用HTTP_GET方法來向外部服務器發送信息,將相關變量組合成GET頁面的URL參數部分進行發送,這樣的實現方法比較簡單易懂。不過在參數較多或者參數比較復雜的情況下,利用URL傳遞參數的方法可能不太適用,我們還是推薦使用HTTP_POST方法來發送數據,將所有參數打包成一個XML或者JSON格式的數據,通過POST方法把數據發送到對方服務器。POST方法對所傳參數的長度和格式一般沒有限制,也基本不會有特殊字符沖突處理問題。
3.3 HTTP接收消息和對外推送
為了便于接收從數據庫推送來的消息并同時往微信企業號推送,我們直接在微信企業號的后臺創建了上述UTL_HTTP包所指定的接受推送頁面sendnotice.aspx,在接收到參數后調用微信企業號的后臺消息發送功能,往指定人員的微信推送相應通知信息。后臺Web服務器由IIS7.0搭建,代碼用C#編寫,在Page_Load時運行的有關代碼片段如下:

其中往微信企業號內用戶發送通知消息的iUPC_Notice類具體實現的是與微信企業號公眾平臺所對接的相關標準[6],具體內容參見騰訊公司發布的企業號使用文檔,該文檔描述了后臺服務器與微信企業號之間的接口規范和調用流程等等細節,在此不再累述。
從數據安全角度來說,在數據庫軟件中主動調用HTTP協議訪問外部站點是一個高危動作,因此Oracle對內部用戶是否能發起對外HTTP連接做了嚴格的限制。在以前的版本是控制某用戶對 UTL相關網絡訪問包(UTL_HTTP、UTL_MAIL、UTL_TCP等等)的調用權限,而在Oracle 11g版本中進行了更高細粒度的ACL(Access Control List,訪問控制列表)限制。在PL/SQL下配置用戶“test”訪問某個IP地址80端口的ACL的具體方法如下:

DBMS_NETWORK_ACL_ADMIN包用于創建、管理、修改和刪除ACL,其中的create_acl方法用于創建一條ACL,如果這條 ACL還需要指定給其他用戶使用,還可以利用add_privilege 方法進行添加用戶,assign_acl方法用于對某條ACL及其用戶分配網絡訪問權限,指定其可以訪問的主機和端口,其中host變量可以是IP地址或者域名,也可以使用通配符匹配一段網段。同時也可以多次調用 assign_acl為同一個ACL和其所含用戶授權訪問多個host主機和端口號。
在本文中我們利用存儲過程和觸發器,在數據表發生變化時主動調用UTL_HTTP包訪問數據庫服務器外部的網站,并通過HTTP協議傳遞出相關內容,使消息可以第一時間發送到微信客戶端,避免了輪詢過程對雙方系統的額外開銷。該方法還是個非常適用于通過 POST方法將格式數據發送到通信運營商所提供的短信發送接口,實現全自動的短信提醒功能。除了 UTL_HTTP包外,Oracle 11g還提供了UTL_TCP、UTL_MAIL來實現數據庫對外的socket連接功能和對外發送郵件功能,同樣可以實現本文類似的主動推送功能。另外Microsoft SQL Server和其它主流數據庫軟件均具有類似的存儲過程、觸發器和HTTP訪問機制,有待大家參考和利用。
[1] 馬洪江,周相兵.基于存儲過程的科研績效統計分析系統的實現[J].計算機技術與發展, 2011,21(8)181-184.
[2] 郭紹忠,甄濤,賈琦.基于存儲過程的海量郵件數據挖掘[J].計算機工程, 2010,36(1):40-42.
[3] Database PL/SQL Packages and Types Reference. Chapter 225 UTL_HTTP[EB/OL].[2016-03-02],http://docs.oracle. com/cd/E11882_01/appdev.112/e40758/u_http.htm#ARPL S070.
[4] 林樹澤, 盧芬, 柳冬青. Oracle DBA高可用、備份恢復與性能優化[M].北京:清華大學出版社,2015.
[5] Michael McLaughli.Oracle Database 11g PL/SQL程序設計 [M].張云,等譯.北京:清華大學出版社,2009.
[6] 微信公眾平臺企業號接口文檔[EB/OL].[2016-03-02] http://qydev. weixin.qq.com/wiki/.
Implementation of Message Push System Based on the Stored Procedure and HTTP Protocol
Xia Lingyun, Gong Wentao
(Internet and Education Technology Center, China University of Petroleum (East China), Qingdao 266580, China)
Stored procedures and triggers in database are formerly used for data integrity checking and complex rule restriction, they also provide an actively operating mechanism when the data change in the database table. Oracle Database also provides UTL_HTTP package to achieve the access from database to external WEB server. Using these two characteristics, it can send the changing data to an external service server initiatively and promptly, and then sends the message to the appropriate user through the service server. Thereby avoiding external service systems avoid frequent reading the database server initiatively, it improves messaging system efficiency and reduces the burden on system queries
Stored procedure; Trigger; Message push; Oracle; UTL_HTTP
TP393
A
1007-757X(2016)11-0066-03
2016.07.06)
夏凌云(1980-)男,瀘州人,中國石油大學(華東),網絡及教育技術中心,碩士研究生,工程師,研究方向:互聯網技術、計算機軟
硬件技術和物聯網技術,青島 266580
龔文濤(1984-)男,潛江人,中國石油大學(華東),網絡及教育技術中心,碩士,工程師,研究方向:網絡信息安全,青島 266580