999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種面向消息的中間件的設計與實現

2019-03-28 13:16:12孫弋溫迅
物聯網技術 2019年3期

孫弋 溫迅

摘 要:中間件是位于硬件操作系統和應用之間的通用服務。基于遠程調用的中間件技術已廣泛應用于各個領域。但介于其同步通信、客戶端/服務器強耦合且只能進行點對點通信的問題,其應用始終有相應局限。面向消息的中間件因其忽略平臺異構性、異步通信等良好特點恰好可以解決以上問題。利用SUN公司提出的JMS規范,設計消息模型用于通信,通過Java NIO事件驅動的編程模型實現異步通信,最后實現一種面向消息的中間件系統,并給出了該消息中間件在某高校選課系統中的良好應用。

關鍵詞:消息中間件;消息服務;消息隊列;異步通信;JMS規范;Java

中圖分類號:TP311.1文獻標識碼:A文章編號:2095-1302(2019)03-00-04

0 引 言

隨著企業系統中分布式架構的普及和系統的不斷擴大,在異構和分布環境下完成企業的業務管理、數據共享和數據傳輸已成為行業的焦點,這種環境下,中間件技術應運而生。CORBA(公共對象請求代理體系結構),DCOM(分布式組件對象模型),RMI(遠程方法調用)等以遠程調用為主的RPC(遠程過程調用)中間件技術已廣泛應用于各個領域[1],但是面對愈加復雜的分布式系統,這些技術的局限性也愈加明顯:

(1)同步通信,客戶端發出請求后,須等待接收服務器的響應結果才能繼續執行;

(2)客戶端與服務器強耦合,客戶端和服務器必須同時正常運行;

(3)點對點通信,只有一組客戶端和服務器的通信。

面向消息的中間件(Message-Oriented Middleware, MOM)較好地解決了以上問題[2]。在消息中間件中,區別于傳統的遠程通信客戶端和服務器的概念,通信的兩端分別為Producer(生產者,發送消息的一方)和Consumer(消費者,接受消息的一方)。生產者將消息發送到中間件服務器中,中間件將消息通過消息隊列進行管理[3],在合適的時候再轉發給消費者。這種模式下發送者和接收者之間是異步的,二者生命周期未必相同。同時,一條消息的接收者也不一定唯一,對于一個消息可以有多個接收者。

面向消息的中間件系統為企業提供數據傳輸服務已經多年,但始終沒有統一的標準[4]。這使得各中間件廠商產品的實現和接口各異,不同廠商中間件系統之間難以實現互操作和無縫連接。在SUN公司提出Java消息服務(Java Message Service,JMS)規范后有所改觀。

本文深入研究了SUN公司的JMS規范,同時在此基礎上,基于JMS規范設計實現了中間件系統,并給出一個在高校選課系統中消息中間件的應用實例。

1 Java消息服務

Java消息服務(JMS)是由SUN公司提出的消息中間件規范。因此JMS規范只是一系列統一的接口,并沒有具體實現。用戶可根據自己的需求對JMS接口進行實現,因為該接口與消息提供者無關,因此客戶端的應用程序可在不同機器和系統中移植[5]。同時還可結合用戶實際業務而不同實現,以達到滿意的效果。

1.1 JMS通信方式

JMS提供客戶端與服務器的同步和異步連接,并在任何時候可對消息進行傳送和儲存轉發。消息傳輸中支持兩種截然不同的通信模型:點對點模型和發布/訂閱模型[6]。

(1)點對點模型:使用Queue(即隊列)。消息從一個生產者傳送到一個消費者。在此傳送模型中,消息目的地是一個隊列。消息首先傳遞給隊列目標,再將消息從隊列發送給注冊到此隊列的消費者。向隊列發送消息的生產者數量是沒有限制的,但每個消息只能由一個消費者消費。如果沒有已注冊到隊列目標的消費者,隊列將保存接收到的消息,當消費者注冊到隊列時再傳遞給該消費者。點對點模型如圖1所示。

(2)發布/訂閱模型:使用Topic(即主題)。消息從一個生產者傳送到任何數量的消費者。在此傳送模型中,消息目的地是一個主題。消息首先傳遞給主題目標,再傳遞給訂閱此主題的所有活動消費者。向主題對象發送消息的生產者的數量沒有限制,并且每條消息都可發送給任意數量的訂閱者[7]。主題目標也支持持久訂閱的概念。持久訂閱意味著消費者已注冊了主題目標,但該消費者在消息傳遞時可能處于非活動狀態。當這位消費者再次進入活躍狀態時,會收到此信息。發布/訂閱模型如圖2所示。

1.2 JMS消息數據結構

在消息中間件中,通信的兩端通過消息傳遞信息。JMS消息對象是應用程序之間通信的基本單元。JMS消息由消息頭、消息屬性和消息體組成。消息頭描述了消息的創建者、創建時間、數據的有效長度、消息的目標隊列或主題的路由信息。屬性由客戶端定義和設置,消息體是消息的主要部分,它描述消息的內容。JMS消息模型如圖3所示。

(1)消息頭:所有JMS消息都支持統一的消息頭域,消息頭包含標識信息和路由信息。一個完整的消息頭將會傳送給所有接收消息的JMS客戶端,但不會傳送給非JMS客戶端。

(2)消息屬性:可認為消息屬性是附加的消息頭,用來支持JMS消息構建工具需要的屬性值。為消息提供了一種附加可選擇的消息頭機制。附帶應用獲其他數據,用于消息選擇器。

(3)消息體:JMS根據要攜帶的消息類型,規定消息中間件必須支持6種消息接口類型,但JMS并未定義這幾種消息接口的實現方式。因此允許消息提供者以自己的方式實現和傳送消息。這幾個接口分別是Message及該接口的5個子接口TextMessage,MapMessage,StreamMessage,ByteMessage和ObjectMessage[8]。

1.3 JMS編程模型

在JMS編程模型中,JMS客戶端通過消息服務進行消息通信。消息生產者向消息服務發送信息,同時消費者從消息服務中接受這些信息。整個通信過程使用一組JMS接口的對象來執行。

在JMS編程模型中,JMS客戶端使用ConnectionFactory對象創建一個連接對象Connection,該對象用來向消息服務發送消息或接收消息。創建連接時,將分配通信資源。大多數的客戶端均使用同一個連接對象來進行所有的消息通信。

接下來通過連接對象創建Session會話對象。Session是一個用于生成和使用消息的單線程上下文對象。用于創建通信的MessageProducer(生產者),MessageConsumer(消費者)和Destination(消息目的地),并為發送的消息定義順序。該對象通過大量的確認選項或事務來支持可靠傳輸。

發送消息時,客戶端使用MessageProducer指定Destination對象。消息生產者可設置默認傳送模式(是否持久化)、優先級和有效期值,對發往消息服務的信息進行控制。

接收消息時,客戶端使用MessageConsumer對象從指定的Destination對象接收消息。接收過程中可使用消息選擇器來接收消息客戶端感興趣的消息。

消費者支持同步或異步消息接收。異步接收時可向消費者注冊MessageListener(消息監聽器)。當會話線程調用MessageListener對象的onMessage()方法時,客戶端將接收該消息。JMS編程模型如圖4所示。

2 消息隊列中間件的實現

2.1 消息隊列技術

消息中間件采用消息隊列技術和基于消息傳遞的異步通信機制。在分布式和異構環境中,傳統應用程序之間的相互通信需要雙方同步執行。 各系統應用間耦合性過強,在消息中間件中使用消息隊列技術,可大大減少程序之間的耦合度,應用程序只需發送一條消息后可繼續操作。接收方應用程序也無需監視整個接收過程,只需從隊列中讀取消息并對其進行處理即可。

2.2 基于JMS的消息中間件的體系結構

消息中間件在結構上分為兩個部分,客戶端和服務端。其中包含了一個JMS應用必備的4個模塊,分別是JMS客戶端、JMS提供者、消息和JNDI服務。JMS消息中間件體系結構如圖5所示。

其中消息中間件服務包含JMS服務(消息服務)和JNDI服務(命名對象服務)。JMS規范中提供兩種受管對象,ConnectionFactory和Destinatio,即前文提到的連接工廠和消息目的地需要由JNDI命名空間進行管理。JMS受管對象如圖6所示。

2.3 JMS消息中間件的實現

2.3.1 服務器端的實現

(1)服務器的實現

JMS服務器是消息中間件服務的核心。服務器啟動時,初始化服務器,讀取主機地址、監聽端口、服務類型等相關參數,并啟動相應的組件。JMS Server結構如圖7所示。

通過讀取到的相關參數,創建ServerBroker組件。同時監聽相關端口中來自客戶端的請求。ServerBroker組件用來處理與客戶端的消息通信;JMS Server的具體實現的主要API見表1所列。

最后,將啟動的ServerBroker組件保存在列表當中,該列表保存所有當前活動的客戶端連接。

消息服務可通過多種方式實現消息通信,如TCP,UDP,RMI,HTTP等,通過定義ServerBroker接口,規范連接過程并將具體通信方式做不同實現。

(2)ServerBroker接口

該消息服務的ServerBroker采用TCP方式進行通信,調用start()方法后,創建一個ServerSocket監聽客戶端請求。收到連接請求后,ServerBroker會創建一個新線程,并通過ServerSocket的accep()方法獲取客戶端socket與之通信。ServerBroker API見表2所列。

(3)Transport類的實現

ServerBroker組件通過Transport類實現消息傳遞,該類在一個新的線程當中,通過其send()方法輪詢的發送隊列中的消息。該線程將一直處于輪詢狀態直到調用了stopTransport()方法。Transport API見表3所列。

(4)JNDIServer類的實現

JNDI服務主要用于管理受管對象ConnectionFactory和Destination。初始化JNDI服務后,TCPConnection方法創建ServerSocket用來監聽客戶端的請求并與之建立連接。最后通過管理器通過bind()方法綁定JNDI受管對象和消息目的地。同時客戶端可通過lookup()方法獲取已注冊的受管對象。JNDI Server見表4所列。

2.3.2 客戶端API的實現

客戶端實現由JMS API定義的標準接口。 本系統的JMS客戶接口的主要實現如下:

(1)Connection對象

Connection是JMS客戶端和JMS消息服務之間處于活動狀態的套接字。Connection在創建客戶端時對其可指定唯一的客戶端標識符。連接創建后,它處于掛起模式,此時不提供任何消息。直到客戶調用 start()方法開始消息傳遞。JMS針對兩種消息模型定義了兩種連接對象。我們在此實現QueueConnectionImpl和TopicConnectionImpl。主要功能為獲取Session對象和啟動關閉連接。

(2)Session對象

Session對象是通信中消息的創建者、生產者、消費者、主題和隊列的生產工廠。針對JMS規范,創建實現類SessionImpl,用于創建不同類型的消息,并返回相應Message對象;用于創建通信的客戶端、生產者、消費者;用于創建消息目的地和消息模型。

(3)MessageProducer對象

MessageProducer對象由Session對象創建,主要用于向對應Destination發送消息。其中主要實現其send()方法。通過設定目的地、傳送方式、優先級等發送消息。

(4)MessageComsumer對象

MessageConsumer是Session對象所創建,用于接收來自Destination 的消息。主要實現receive()方法用來接收消息。receive()方法中可配置消息選擇器用于配置接收期望的消息。同時可選擇通過或異步的接收消息。對于同步接收,采用輪詢的辦法;對于異步接收,將會注冊一個消息監聽器MessageListener對象,并通過其OnMessage方法來處理異步消息。

2.3.3 消息模型的實現

消息模型按照JMS規范中消息結構的定義對其進行實現。消息頭中,Messageheader類中包含了Destination,MessageID,Priority等消息識別信息和路由信息。JMSMessageID唯一標識了隊列或主題中的每一個消息。

2.3.4 消息隊列中間件在高校選課系統中的應用

高校選課系統中的主要需求是選課時對課程余量的并發爭搶。有限的課程數量面對瞬時的高并發請求,此時就可利用消息中間件良好的異步通信特性來實現。當用戶點擊選課按鈕后,將請求發送至中間件服務器。隊列管理器開始將請求加入課程選課隊列,成功則告知正在選課,否則客戶端響應選課結束。對于隊列中的選課請求則進行課程余量減庫存處理,并記錄結果。選課過程完成后標記選課結束,并清空選課隊列,避免重復判斷和處理[9-10]。

用戶輪詢結果,如果選課結束且該用戶選課失敗,則跳轉到選課結束頁面,否則繼續等待直到成功。后面選課結果的持久化,則是選課邏輯中需要操作的業務。消息中間件在高校選課系統中的應用實例如圖8所示。

4 結 語

消息中間件在大型企業分布式應用中具有豐富的應用。相較于通過遠程調用實現服務傳遞的系統,面向消息的中間件提出了一種靈活、擴展性好且使用簡單的通信模式。可為高并發需求提供緩沖,也可忽略平臺異構性,為分布式應用提供簡單的中間橋梁。極大地增強了系統集成的簡易程度和擴展性,降低了系統更新維護成本和難度,使系統更加高效運行。目前,面向消息的中間件系統已成為中間件系統中發展最快體系,有著非常廣闊的前景。

參 考 文 獻

[1]陳旭東. 基于CORBA技術的綜合電信網管系統的構建[D].北京:華北電力大學,2005.

[2]張靖,邱云.JMS信息發布異構平臺應用研究[J].煤炭技術,2010,29(1):209-211.

[3]何雙元. 高并發下消息隊列模型的研究與應用[D].武漢:武漢理工大學,2015.

[4]朱方娥,曹寶香.基于JMS的消息隊列中間件的研究與實現[J].計算機技術與發展,2008(5):172-175.

[5]汪濤. 基于SOA架構的中間件應用集成研究[D].西安:西安電子科技大學,2011.

[6] 佚名.Java Message Service API Rev[EB/OL].[2002-04-08].http: //java.sun. com/products/jms/.

[7]李艷春,李新,焦文彬.分布式信息系統中數據交換平臺設計與實現[J].計算機工程與設計,2012(7):2640-2645.

[8]珍兆科.Java EE 6開發手冊·高級篇[M].北京:電子工業出版社,2014.

[9]王迎.自動化測試平臺的設計與實現[D]北京:北京交通大學,2015.

[10]邵作鎮,萬曉冬.基于STAF的軟件自動化測試研究與應用[J].電子科技,2010(7):9-11.

主站蜘蛛池模板: 色综合热无码热国产| 热久久综合这里只有精品电影| 99色亚洲国产精品11p| av午夜福利一片免费看| 欧美一级在线| 亚洲成人一区二区三区| 精品伊人久久大香线蕉网站| 三上悠亚精品二区在线观看| 国产高颜值露脸在线观看| 永久毛片在线播| 亚洲天堂久久久| 国内精品久久久久久久久久影视| 在线精品视频成人网| 欧美一区精品| 嫩草影院在线观看精品视频| 欧美一区中文字幕| 制服丝袜一区二区三区在线| 免费毛片a| 欧美一区二区三区国产精品| 国产欧美日韩va另类在线播放| 国产小视频a在线观看| 亚洲欧美另类日本| 无码专区在线观看| 日本精品影院| 69视频国产| 国产真实乱子伦视频播放| 丁香六月综合网| 尤物亚洲最大AV无码网站| 国产在线视频欧美亚综合| 丰满人妻中出白浆| 久久久久久久久18禁秘| 免费高清毛片| 成人在线视频一区| 手机在线免费毛片| 无码视频国产精品一区二区| 欧美性天天| 91九色视频网| 亚洲国产成人精品一二区| 99re经典视频在线| 欧美日韩在线亚洲国产人| 亚洲午夜天堂| 乱码国产乱码精品精在线播放| 亚洲无码日韩一区| a亚洲视频| 国产精品3p视频| 亚洲精品无码在线播放网站| 18禁不卡免费网站| 欧美日韩亚洲综合在线观看| av午夜福利一片免费看| 精品国产aⅴ一区二区三区 | 国产裸舞福利在线视频合集| 无码高潮喷水专区久久| 中国国产A一级毛片| 国产在线小视频| 在线欧美日韩| 亚洲自偷自拍另类小说| 国产亚洲精品在天天在线麻豆 | 亚洲色图狠狠干| 亚洲欧美在线综合图区| 在线国产毛片手机小视频| 99久久人妻精品免费二区| 永久在线精品免费视频观看| 五月婷婷伊人网| 人妻丰满熟妇AV无码区| 精品国产中文一级毛片在线看| 国产黑丝视频在线观看| 国产理论一区| 999福利激情视频| www.精品视频| 欧美一区二区啪啪| 久久人午夜亚洲精品无码区| 国产亚洲精品97在线观看| 99久久国产精品无码| 国产精品免费露脸视频| 亚洲日韩日本中文在线| 午夜成人在线视频| 国产一区二区在线视频观看| 99久久亚洲综合精品TS| 极品性荡少妇一区二区色欲| 国产午夜人做人免费视频中文| 亚洲国产综合自在线另类| 久久综合丝袜长腿丝袜|