耿國光,張兆國,蔡明月
(1、2,廣西旅發(fā)科技有限公司,高級工程師,廣西 南寧,530028;3、中國鐵路南寧局集團有限公司 信息技術所,工程師,廣西 南寧,530029)
在開發(fā)車輛監(jiān)控系統(tǒng)時,首先要完成的是建立服務器與定位終端的網(wǎng)絡通信,進而實現(xiàn)定位數(shù)據(jù)的解析、入庫、指令下發(fā)等工作。目前車輛監(jiān)管中使用最多的網(wǎng)絡通信框架有Mina 和Netty。Mina 是Apache 組織的一個項目,它為開發(fā)高性能和高可用性的網(wǎng)絡應用程序提供非常便利的框架。雖然Mina 處理數(shù)據(jù)能力很強,但無法做到高并發(fā),因為Mina 將所有的處理事件以輪詢方式全部放入同一個任務隊列中進行處理,當網(wǎng)絡一旦發(fā)生延遲就會造成隊列的阻塞[1]。Netty 是由JBoss 提供的一個Java開源框架,它對高并發(fā)的處理做了很大改進,它將隊列分成了任務隊列和延遲隊列[2],任務隊列中存放所有要執(zhí)行的任務,延遲隊列負責定時調度任務。
Spring Integration 是Spring 開發(fā)的一個開源的輕量級ESB(Enterprise Service Bus,企業(yè)服務總線)框架,旨在提供企業(yè)系統(tǒng)集成解決方案[3]。它構建在Spring 控制反轉設計模式之上[4],擴展了傳統(tǒng)Spring 模型通過事件驅動和消息傳遞為中心的架構,以解決集成開發(fā)問題。另外,Spring Integration基于XML Schema 的配置,能夠與Spring 框架和J2EE強大集成。
Spring Integration 包含三個基本組件,分別是存儲信息的消息組件Message(消息)、消息處理組件Message Endpoints(消息終端)、用于連接消息終端的消息通道組件Message Channel(消息通道)。其中,消息終端組件和消息通道組件因其具體功能不同,又包含許多子組件。下面對一些核心組件進行介紹。
1)Message(消息)。消息是信息存儲組件,可以在不同的消息終端之間進行傳遞,是最基本的信息單元。消息包括Header(消息頭)和Payload(消息負載)兩部分。消息頭存儲信息的屬性值,如消息id、消息有效時間和消息返回地址等。消息負載存儲信息本體,可以是任何類型的數(shù)據(jù),如XML、字符串或者java對象等。
2)Message Channel(消息通道)。消息通道是消息傳遞組件,它的作用是連接不同的消息終端,從而能夠實現(xiàn)消息在不同終端之間的傳遞。消息通道結構如圖1所示。
圖1 消息通道
消息通道的作用是消息生產(chǎn)者將消息發(fā)送到消息通道,消息消費者從消息通道中獲取消息,從而實現(xiàn)了消息生產(chǎn)者和消費者之間的解耦。另外消息通道還提供了消息攔截功能,可以用來監(jiān)控消息。
3)Message Endpoint(消息終端)。消息終端是用來處理消息的組件,下面介紹幾種常用的消息終端。
(1)Transformer(消息轉換器)。消息轉換器是一種消息格式轉換終端,它能夠對消息的內容或結構進行轉換。比如它可以將消息負載從Integer 類型轉換成String 類型,也可以添加、修改或刪除消息頭中的值。
(2)Filter(消息過濾器)。消息過濾器能夠對消息類型進行過濾,把滿足條件的消息發(fā)送到消息通道。
(3)Router(消息路由器)。消息路由器是一種消息路由處理終端,它根據(jù)消息的內容決定消息的下一個處理終端,從而將消息發(fā)送到相應的消息通道,消息路由器不會改變原有消息的內容。
(4)Service Activator(服務激活器)。服務激活器是一個邏輯處理終端,它接收到輸入通道傳入的消息后可以調用應用程序接口來處理消息,并將處理結果新的消息發(fā)送至輸出通道。
(5)Channel Adapter(通道適配器)。通道適配器是消息傳遞系統(tǒng)與消息生產(chǎn)者和消息消費者聯(lián)系的門戶,可以分為Inbound 類型和Outbound 類型,其中Inbound 類型通道適配器獲取消息源的消息,把消息傳入到消息通道。Outbound 類型通道適配器把消息通道中的消息傳給其它系統(tǒng)。通道適配器如圖2所示。
圖2 通道適配器
Spring Integration 提供對TCP 和UDP 網(wǎng)絡通信的支持,使得Spring Integration 可以基于TCP 協(xié)議或UDP 協(xié)議對車載定位終端進行集成。Spring Integration 可以把與每一個終端的通信都單獨封裝成一個線程處理,通過這種多線程處理機制很好地保障了對高并發(fā)的處理。
2.1 配置TCP 連接Spring Integration 通過連接工廠與定位終端建立TCP 連接,其中連接工廠分為server 類型和client 類型。Server 類型連接工廠用于服務器端,它能夠監(jiān)聽tcp 連接請求,從而與客戶端建立連接。Client 類型連接工廠用于客戶端,能夠向服務器端發(fā)送tcp 連接請求。車載定位終端是Tcp 通信請求方,所以這里要使用server 類型的連接工廠。連接工廠的配置如圖3所示。
圖3 連接工廠配置
zdkGpsDeserializer 是自定義反序列化對象,用于實現(xiàn)終端上傳數(shù)據(jù)的解碼邏輯。 類ZdkGpsDeserializer 需要實現(xiàn)接口Deserializer<T>,并重寫deserialize(InputStream var1)方法,其中T 是反序列化方法返回的結果類型。
zdkGpsSerializer 是自定義序列化對象,用于序列化發(fā)送到終端的數(shù)據(jù)。類ZdkGpsSerializer 需要實 現(xiàn) 接 口Serializer<T>,并 重 寫serialize(T var1,OutputStream var2)方法,其中類T 是定位終端接收的數(shù)據(jù)類型。
zdkGpsConnectionMapper 是JMS 消息與Spring Integration 消息的映射器對象,該對象用于實現(xiàn)終端消息類型與Spring Integration 消息類型的轉換。類ZdkGpsConnectionMapper 需 要 繼 承 類TcpMessageMapper,并 重 寫Message<? >toMessage(TcpConnection connection, Map<String, Object>headers)方法。在toMessage 方法中既要實現(xiàn)終端消息的反序列化,還要記錄下終端與服務器的Tcp 連接對象,以便使用該連接對象向定位終端發(fā)送控制指令。
組件<int-ip: tcp-connection-factory/>用來配置TCP連接工廠,配置的各屬性含義如表1所示。
表1 連接工廠配置屬性
2.2 配置消息網(wǎng)關定位終端與服務器建立TCP連接后,服務器需要配置消息網(wǎng)關以定義消息在服務器中的流向。消息網(wǎng)關配置如圖4所示。
圖4 TCP網(wǎng)關配置
標簽<int:channel/>定義了兩個消息通道:標簽<int-ip:tcp-inbound-gateway>用來定義tcp-inbound類型的網(wǎng)關。在該配置中,反序列化輸出的消息流進入通道zdkGpsInputChannel 中。發(fā)往定位終端的消息流則通過zdkGpsInputChannel 通道離開服務器。
2.3 配置服務激活器服務器接收到定位終端發(fā)送的信息后,一般會向定位終端回復相應的信息以告知定位終端消息已經(jīng)收到。接收到的消息不同,需要回復的消息也不同,這就要根據(jù)接收到的消息動態(tài)的構造回復信息。動態(tài)構造回復消息過程可以通過服務激活器完成。服務激活器配置如圖5 所示。
圖5 服務激活器配置
標簽<int:service-activator>用來定義服務激活器。在該配置中通道zdkGpsInputChannel 中的消息流會傳入到類ZdkGpsMessageHandle 的方法dealMessage中進行處理。
2.4 配置TcpConnection 事件監(jiān)聽當服務器與車載定位終端建立的TcpConnection 發(fā)生變化時,Spring Integration 會發(fā)送TcpConnectionEvent 事件。TcpConnectionEvent是ApplicationEvent的子類,能被ApplicationListener接收。當定位終端由于某些原因(沒有信號、終端斷電等)斷開與服務器連接時,服務器需要關閉連接并釋放該連接占用的資源。
本文基于Spring Integration 對TCP 的支持實現(xiàn)了服務器與定位終端的網(wǎng)絡通信。這種通信機制已經(jīng)在我司的車輛監(jiān)控平臺得到應用,通過對我司平臺下2000 輛車的實時監(jiān)控,這種框架能夠很好的保障服務器與定位終端通信的實時性以及定位終端的高并發(fā)性。目前Spring Integration 在TCP 通信方面應用較少,但是隨著基于Spring 的J2EE 框架應用越來越廣泛,Spring Integration 因其與Spring 的完美集成,其應用必將不斷擴大。