張令芬
(河海大學 商學院,江蘇 南京 211000)
一種基于JMS的實時推送技術
張令芬
(河海大學 商學院,江蘇 南京 211000)
當今互聯(lián)網(wǎng)盛行的背景下,一些系統(tǒng)軟件對獲取實時性數(shù)據(jù)的要求越來越高,服務器推送技術越來越受到人們的關注,雖有對推送技術的研究變得更具有實用價值和意義。由于出現(xiàn)了基于web的服務器反向推送技術,這也是本文的創(chuàng)新之處所在,本文在傳統(tǒng)研究的基礎之上,提出了一種基于消息總線的實時推送技術,該技術采用JMS消息服務、結合DWR框架來實現(xiàn)模塊間信息的實時傳遞,在文中首先是提出方案,并研究通過對不同模塊之間的程序進行設計,最后模擬,最終通過本文對JMS的實時推送技術實現(xiàn)各模塊間的實時數(shù)據(jù)傳送,同時本文研究的技術主要是為高性能的Web應用和開發(fā)來服務的,對于傳統(tǒng)的Web界面也適用。
JMS;實時推送;消息中間件;數(shù)據(jù)傳送;服務器
在當今的互聯(lián)網(wǎng)時代之下,傳統(tǒng)的Web應用模型主要包含了瀏覽器、服務器和數(shù)據(jù)庫這3層典型的架構模型。其中這3種架構負責的功能各有不同,瀏覽器的主要負責提出發(fā)送請求、進而對發(fā)送的請求進行解析,最后用服務器來回復消息并在消息的接收方顯示。當然傳統(tǒng)的Web應用雖然功能很多,但仍然避免不了存在致命的缺陷,就是Web系統(tǒng)根本無法滿足傳統(tǒng)桌面系統(tǒng)的需求?,F(xiàn)實生活中的應用中,服務器的主要工作就是需要向客戶端發(fā)送消息或信息[1]。由于服務器作為系統(tǒng)的主要資源,所以可以在任何時刻獲得因系統(tǒng)發(fā)生變化的第一手資料。所以由于客戶端和服務器之間的持久鏈接使得該系統(tǒng)很方便的實現(xiàn)了服務器的推送,并且進而實現(xiàn)雙向數(shù)據(jù)的傳遞。對于以HTTP協(xié)議為基礎的Web系統(tǒng)而言,它只是一種單向的協(xié)議,對于HTTP協(xié)議是以無狀態(tài)基礎,使得該協(xié)議無法順利實現(xiàn)主動由服務器向瀏覽器發(fā)送數(shù)據(jù)??蛻舳酥荒芟蚍掌靼l(fā)送請求獲取數(shù)據(jù),但是這樣又無法保證客戶端獲取的信息是實時的[2]。
為了解決上述問題,產生了服務器推送技術。它的基本思想是建立在由瀏覽器的主動查詢轉變?yōu)橛煞掌靼l(fā)送信息。也就是由服務器發(fā)送數(shù)據(jù)經過瀏覽器的顯示之后,再將其與服務器連接,之后再繼續(xù)循環(huán)這種操作,從而可以實現(xiàn)服務器的推送技術。
我們國家當前把服務器推送技術可分為兩大類:第一種是建立在無插件的服務器及第二種瀏覽器插件的服務器推。對于第一種的服務器推送技術,由于沒有插件,所以無需在瀏覽器端安裝插件,最具有代表性的有Pushlet,DWR等[3]。而對于客戶端瀏覽器則需要安裝插件,它的工作主要流程就是通過套接字保持與服務器的連接,從而實現(xiàn)數(shù)據(jù)推送,這類需要安裝插件的代表主要有JavaApplet。
Pushlet框架采用JSP技術,在服務器端采用Servlet技
術,編寫一個數(shù)據(jù)推送類,通過HTTP流連接,將服務器產生的事件對象“推”到客戶端瀏覽器,然后客戶端將事件更新到動態(tài)網(wǎng)頁上,而不需要重載整個頁面。Pushlet技術還存在3個方面的不完善之處,主要表現(xiàn)在:1)對于跨瀏覽器的適用于動態(tài)網(wǎng)頁的JavaScript類庫目前還沒有推出。2)用戶的數(shù)量連接受到了限制。3)Push服務器通常服務的時間受到一定的限制,因此對于規(guī)模比較大的應用,服務器運行的性能可能會受到明顯的影響。
DWR作為一個引擎,它的主要功能就是通過服務器端的Java對象傳送給JavaScript代碼使用。DWR也允許服務端Java代碼直接操作頁面DOM元素,對頁面進行局部更新。DWR的服務器推送技術也稱為反響Ajax技術,該技術有3種:輪詢、Comet、PiggyBacking[4]。
Comet是一種推動方式的工具,主要是建立在HTTP長連接的服務器的基礎之上的??蛻舳讼蚍掌靼l(fā)送求情后,服務器將數(shù)據(jù)通過 response發(fā)送給客戶端,但并不會將此response關閉,而是一直通過response的方式,將收到的最新的數(shù)據(jù)發(fā)送給客戶端瀏覽器,最終客戶端瀏覽器得到關閉。
Pushlet和DWR都是無插件服務器推送框架,主要實現(xiàn)是基于HTTP長連接的方式。Pushlet和DWR這兩種框架的有相同之處,就是通過利用JavaScript、Ajax技術對服務器和客戶端瀏覽器的通信進行了封裝,從而使得頁面程序的開發(fā)難度得到了降低。但是,這也會因自身任務過程,使得其性能大幅度下降[5]。本文的研究則主要是在結合DWR和JMS消息服務的基礎之上,實現(xiàn)了一種基于JMS的實時推送技術。該技術目前已經應用于LED公交站顯示屏智能控制系統(tǒng),本來將基于該系統(tǒng)來介紹這一實時推送技術。
2.1 系統(tǒng)架構
系統(tǒng)采用B/S架構,使用Spring框架管理實例,使用SpringMVC做請求轉發(fā)。該系統(tǒng)主要包括了五大模塊的內容,它們之間的交互關系如圖1所示。
圖1 公交站顯示屏智能控制系統(tǒng)模塊間交互示意圖Fig.1 A bus station map display interactive diagram of the intelligent control system module
2.1.1 JMS消息總線
該模塊采用ActiveMQ框架實現(xiàn),實現(xiàn)各獨立模塊間的數(shù)據(jù)通信。ActiveMQ是Apache出品,最流行的,能力強勁的開源消息總線,是一個完全支持JMS1.1和J2EE 1.4規(guī)范的JMS Provider實現(xiàn)。ActiveMQ可以提供一些總線的服務,就如訂閱/發(fā)布模式的消息,其中主要有3種角色,分別為:消息發(fā)布者 (MessagePublisher)、消息主題 (Topic)、消息訂閱者(MessageConsumer)。一個消息主題可以有多個訂閱者,消息訂閱者會監(jiān)聽該消息主題,當消息發(fā)布者向該消息主題發(fā)送信息時,所有的消息訂閱者均會收到該信息[6]。
2.1.2 串口通信模塊
該模塊主要用來與段控制箱進行交互,可實時接收段控制箱發(fā)送的數(shù)據(jù),也可通過無線信號往段控制箱發(fā)送控制命令。
該模塊中包含了一個消息發(fā)布者,可以將接收到的狀態(tài)數(shù)據(jù)通過ActiveMQ中的狀態(tài)信息主題發(fā)布狀態(tài)數(shù)據(jù)消息,消息推送模塊作為狀態(tài)信息主題的訂閱者,會收到該數(shù)據(jù)消息。
該模塊中還包含一個消息訂閱者,監(jiān)聽控制信息主題,當控制轉發(fā)器發(fā)來控制指令時,將控制指令傳遞給段控制箱,從而實現(xiàn)系統(tǒng)遠程控制公交站顯示屏。
2.1.3 數(shù)據(jù)處理模塊
該模塊主要負責處理公交站顯示屏狀態(tài)數(shù)據(jù)、構造控制指令等任務。該模塊內還涉及到JCS緩存技術。對公交站顯示屏的狀態(tài)信息進行緩存,可以將接收到的狀態(tài)信息與緩存中的狀態(tài)信息進行比對,找到發(fā)生改變的數(shù)據(jù),從而不需要使用數(shù)據(jù)庫來存儲公交站顯示屏狀態(tài)信息,提高了計算和處理速度。
2.1.4 消息推送模塊
該模塊采用DWR服務器推送技術。在Java代碼中可以實時向JSP頁面發(fā)送數(shù)據(jù)信息。
2.1.5 控制轉發(fā)模塊
控制轉發(fā)模塊的主要功能的實現(xiàn)主要由SpringMVC中的Controller來負責,主要負責接收前臺JSP發(fā)送的控制請求,并轉發(fā)給段控制箱。
2.2 系統(tǒng)詳細設計
2.2.1 JMS消息總線
該系統(tǒng)內部包含了兩個消息主題,分別是狀態(tài)信息主題和控制信息主題,分別用來傳遞公交站顯示屏狀態(tài)信息和公交站顯示屏控制指令。
系統(tǒng)中有一個JMSFactory類,可以為其他模塊提供創(chuàng)建消息發(fā)布者和消息訂閱者的服務。ActiveMQ啟動后,會開啟一個端口號為 61616的 tcp連 接:tcp://localhost:61616, JMSFactory通過該地址創(chuàng)建一個ActiveMQConnectionFactory用來創(chuàng)建連接實例。
在JMSFactory類中封裝了兩個方法,getMessageConsumer ()和getMessageProducer(),分別可以獲得一個消息訂閱者實例和消息發(fā)布者實例。這兩個方法可以接收一個字符串參數(shù),該參數(shù)指定了消息發(fā)布者要向哪個主題發(fā)布信息,消息訂閱者要監(jiān)聽哪個主題。
MessageProducer類主要負責向消息主題發(fā)送消息,該類的實例有一個 send方法,可以發(fā)送包含實際消息內容的Message實例。
MessageConsumer類主要負責監(jiān)聽消息主題,為該類的實例設置一個MessageListener,可以實現(xiàn)監(jiān)聽器模式,一旦消息發(fā)布者發(fā)布了消息,消息訂閱者可以通過MessageListener監(jiān)聽到消息,并及時做出反映。
其他模塊只需要包含一個設置了 MessageListener的MessageConsumer或者包含一個MessageProducer,這樣與JMS消息總線的交互的功能就可以實現(xiàn)。
2.2.2 消息推送模塊
本系統(tǒng)中設計了一個LCS類,該類負責向JSP界面實時推送公交站顯示屏的狀態(tài)數(shù)據(jù)。Spring可以和DWR結合一起主要,這種裝配的實現(xiàn)只要對spring的配置進行文件配置,就可以注解地方式實現(xiàn)DWR的服務。這樣,在LCS類聲明時,添加一個RemoteProxy(name="LCS")即可[7]。
該模塊需要監(jiān)聽狀態(tài)消息主題,接收由串口通信模塊發(fā)送過來的狀態(tài)信息。通過LCS類實現(xiàn)MessageListener的接口的同時,還可以定義一個MessageConsumer實例,即可實現(xiàn)狀態(tài)信息的監(jiān)聽。LCS類還實現(xiàn)了Observer接口。該模塊采用觀察者模式,在onMessage方法中,每接收到一次狀態(tài)信息,都會創(chuàng)建一個DataProcessor線程,有關這個線程的實例還繼承了 Observable類, 設置其觀察 者為 LCS類的實 例。DataProcessor用來解析和處理狀態(tài)信息,這部分將在數(shù)據(jù)處理模塊詳細介紹。DataProcessor處理完成后通知LCS類的實例,LCS將返回的結果通過pushData直接推送到JSP界面進行處理并顯示。信息推送過程如圖2所示。
圖2 消息推送過程時序圖Fig.2 Message push process timing diagram
2.2.3 控制轉發(fā)模塊
SpringMVC框架中Controller可以接收JSP發(fā)送的請求,并進行處理和轉發(fā)。該系統(tǒng)中LCSController實現(xiàn)這一功能。在LCSController中,定義了一個ControlInfoService,該類實現(xiàn)了消息發(fā)布者的功能,可以向控制消息主題發(fā)送控制指令。LCSController在接收到JSP的控制請求后,經過簡單的判斷后,調用數(shù)據(jù)處理模塊的控制指令構造方法獲得具體的控制命令字符串,然后通過ControlInfoService的實例發(fā)送到控制消息主題。
2.2.4 數(shù)據(jù)處理模塊
該模塊中負責數(shù)據(jù)處理的核心類為DataCenter。該類負責解析公交站顯示屏狀態(tài)信息、構造控制指令字符串、與緩存數(shù)據(jù)比對、更新緩存數(shù)據(jù)、格式化緩存數(shù)據(jù)等功能。串口通訊模塊接收的狀態(tài)信息是經過壓縮的,decodeStatusInfo方法可以解析狀態(tài)信息,并將狀態(tài)信息封裝成系統(tǒng)需要的數(shù)據(jù)格式,從而可以跟JCS緩存中的現(xiàn)有數(shù)據(jù)進行比對。在數(shù)據(jù)比對過程中,會將發(fā)生改變的數(shù)據(jù)提取出來,并進一步封裝成適合前臺處理的json數(shù)據(jù)格式,同時更新緩存數(shù)據(jù)。如果在比對過程中發(fā)現(xiàn)有緩存中不存在的數(shù)據(jù),則需要將數(shù)據(jù)添加到緩存中。則消息推送模塊與數(shù)據(jù)處理模塊類圖如圖3所示。
圖3 消息推送模塊與數(shù)據(jù)處理模塊類圖Fig.3 Message push module and data processing module class diagram
2.2.5 系統(tǒng)界面
系統(tǒng)界面使用DIV和CSS做UI設計和現(xiàn)實,使用Ajax技術與控制轉發(fā)器進行交互。在與消息推送模塊進行交互時,直接調用LCS中的初始化頁面的方法,從數(shù)據(jù)處理模塊獲取緩存數(shù)據(jù),解析并構造頁面內公交站顯示屏信息的顯示。消息推送模塊將更新的數(shù)據(jù)推送到JSP頁面,由JS腳本解析數(shù)據(jù)并更新界面顯示。
本文提出的基于JMS的實時推送技術,在公交站顯示屏智能控制系統(tǒng)中得到了成功的應用。DWR框架實現(xiàn)了由服務器向瀏覽器推送消息的功能,ActiveMQ框架實現(xiàn)了各模塊間的實時數(shù)據(jù)傳送。由于公交站顯示屏智能控制系統(tǒng)的使用用戶數(shù)量有限,因此在實際使用過程中,DWR并沒有暴露太多性能方面的缺陷。但是,也不可否認其在性能方面的缺陷。本文研究推出的技術主要是為數(shù)據(jù)實時性要求較高的Web應用和開發(fā)來服務的,當然也可用于實時推送技術的系統(tǒng)之中去。
[1]孫清國,朱瑋,劉華軍,等.Web應用中的服務器推送技術研究綜述[J].計算機系統(tǒng)應用,2008,11:116-120.
[2]張城.基于Web模式的推技術框架研究與應用[D].長沙:中南大學,2010.
[3]晏勇智.基于HTTP長連接的服務器推送技術研究[D].長沙:湖南大學,2010.
[4]鄭強.web服務器推送技術的設計與實現(xiàn)[D].北京:北京郵電大學,2013.
[5]李小智.基于消息中間件的服務器推送技術的應用研究[D].長沙:湖南大學,2010.
[6]汪紅兵,佘春東,范植華,等.基于JMS的數(shù)據(jù)推送系統(tǒng)的設計與實現(xiàn)[J].計算機應用,2005(S1):366-368.
[7]薛真真.基于服務器推送和事件流處理技術的實時Web系統(tǒng)研究[D].杭州:浙江大學,2008.
A real-time information push technique based on Java message service
ZHANG Ling-fen
(Business School,Hohai University,Nanjing 211000,China)
Under the background of todayˊs Internet prevailed,some system software for real-time data acquisition have become increasingly demanding,server push more and more peopleˊs attention,although the study of push technology becomes more practical value and significance.Due to the emergence of web-based server reverse push technology,which is the innovation of this paper,on the basis of the above traditional research,we propose a real-time push technology-based message bus, the technology uses a JMS message service,combined DWR framework to achieve real-time transmission of information between modules in the paper first is a proposal,and the study design,the final simulation program between the different modules,the ultimate real-time data between modules by this paper,the real-time push technology JMS transmission,while this research technique mainly for high-performance Web applications and development to serve,for the traditional Web interface is also applicable.
JMS;real-time push;message-oriented middleware;data transfer;server
TN31
:A
:1674-6236(2015)23-0060-03
2015-03-11稿件編號:201503154
張令芬(1986—),女,山東滕州人,碩士研究生。研究方向:財務管理。