深入浅出JMS(一)——JMS简单介绍
????? 假設(shè)手機(jī)僅僅能進(jìn)行實時通話,沒有留言和短信功能會怎么樣?一個電話打過來,正好沒有來得及接上,那么這個電話要傳遞的信息肯定就收不到了。為什么不能先將信息存下來,當(dāng)用戶須要查看信息的時候再去獲得信息呢?伴隨著這個疑惑,短息和留言應(yīng)運而生,不管手機(jī)是否開機(jī)、是否未及時接到,我們都能得到當(dāng)中的信息。JMS提供了相似這種功能,本章我們將系統(tǒng)的學(xué)習(xí)JMS中的相關(guān)重要內(nèi)容。
????? ? 掌握J(rèn)MS基本概念及適用范圍
????? ? 點對點模型與公布/訂閱模型的差別和使用場合
????? ? 熟悉核心和通用的JMS API
????? ? 熟悉并理解JMSclient開發(fā)的步驟
????? ? 消息的同步和異步接收的實現(xiàn)方式
????? ? 串包問題的解決的方法
企業(yè)消息系統(tǒng)
????? Java Message Service是由Sun開發(fā)的,它為 Java程序提供一種訪問企業(yè)消息系統(tǒng)的方法。在討論JMS之前,我們分來析一下企業(yè)消息系統(tǒng)。
????? 企業(yè)消息系統(tǒng),即面向消息的中間件(MOM),提供了以松散耦合的靈活方式集成應(yīng)用程序的一種機(jī)制。它們提供了基于存儲和轉(zhuǎn)發(fā)的應(yīng)用程序之間的異步數(shù)據(jù)發(fā)送,即應(yīng)用程序彼此不直接通信,而是與作為中介的MOM 通信。MOM提供了有保證的消息發(fā)送,應(yīng)用程序開發(fā)者無需了解遠(yuǎn)程過程調(diào)用(PRC)和網(wǎng)絡(luò)/通信協(xié)議的細(xì)節(jié)。ActiveMQ正是MOM中優(yōu)秀的一員。
企業(yè)消息系統(tǒng)的優(yōu)點
我們先來看看下圖,應(yīng)用程序A將Message發(fā)送到server上,然后應(yīng)用程序B從server中接收A發(fā)來的消息,通過這個圖我們一起來分析一下JMS的優(yōu)點
圖 1 JMS通訊示意圖
提供消息靈活性
????? 應(yīng)用程序A與應(yīng)用程序B通過使用MOM的應(yīng)用程序編程接口(API)發(fā)送消息進(jìn)行通信。MOM 將消息路由給應(yīng)用程序B,這樣消息就能夠存在于MOM中,MOM 負(fù)責(zé)處理網(wǎng)絡(luò)通信。假設(shè)網(wǎng)絡(luò)連接不可用,MOM會存儲消息,直到連接變得可用時,再將消息轉(zhuǎn)發(fā)給應(yīng)用程序B。
????? 靈活性的還有一方面體如今,當(dāng)應(yīng)用程序A發(fā)送其消息時,應(yīng)用程序B甚至能夠不處于運行狀態(tài)。MOM將保留這個消息,直到應(yīng)用程序B開始運行并試著檢索消息為止。這還防止了應(yīng)用程序A由于等待應(yīng)用程序B檢索消息而出現(xiàn)堵塞。
????? 這樣的異步通信要求應(yīng)用程序的設(shè)計與如今大多數(shù)應(yīng)用程序不同,只是對于時間無關(guān)或并行處理,它可能是一個極事實上用的方法。
松散耦合
????? 企業(yè)消息系統(tǒng)的真正威力在于應(yīng)用程序的松散耦合。在上面的圖中,由應(yīng)用程序A發(fā)送消息指定一個特定目標(biāo),如“訂單處理”。而如今,是由應(yīng)用程序B提供訂單處理功能。
????? 可是在將來,我們能夠用不同的訂單處理程序替換應(yīng)用程序B,應(yīng)用程序A將不再是明智之選。替換應(yīng)用程序?qū)⒗^續(xù)發(fā)送消息完畢“訂單處理”,而消息也仍將得到處理。
????? 相同,我們也能夠替換應(yīng)用程序A,僅僅要替換應(yīng)用程序繼續(xù)發(fā)送消息進(jìn)行“訂單處理”,訂單處理程序就無需知道是否有一個新的應(yīng)用程序在發(fā)送訂單。
JMS是什么
????? JMS是一系列的接口及相關(guān)語義的集合,通過這些接口和和當(dāng)中的方法,JMSclient怎樣去訪問消息系統(tǒng),完畢創(chuàng)建、發(fā)送、接收和讀取企業(yè)消息系統(tǒng)中消息。
????? 在JMS之前,每一家MOM廠商都用專有API為應(yīng)用程序提供對其產(chǎn)品的訪問,通常可用于很多種語言,當(dāng)中包含Java語言。JMS通過MOM為Java程序提供了一個發(fā)送和接收消息的標(biāo)準(zhǔn)的、便利的方法。用JMS編寫的程序能夠在不論什么實現(xiàn)JMS標(biāo)準(zhǔn)的MOM上執(zhí)行。
????? JMS可移植性的關(guān)鍵在于:JMS API是由Sun作為一組接口而提供的。提供了JMS功能的產(chǎn)品是通過提供一個實現(xiàn)這些接口的提供者來做到這一點的。開發(fā)者能夠通過定義一組消息和一組交換這些消息的應(yīng)用程序,建立JMS應(yīng)用程序,實現(xiàn)異步通訊。
JMS的目標(biāo)
????? JMS從提出以來,致力于完畢例如以下幾個目標(biāo):
定義一組消息公用概念和有用工具。
????? 全部Java應(yīng)用程序都能夠使用JMS中定義的API去完畢消息的創(chuàng)建、接收與發(fā)送,不論什么實現(xiàn)了JMS標(biāo)準(zhǔn)的MOM都能夠作為消息的中介,完畢消息的存儲轉(zhuǎn)發(fā)。
最大化消息應(yīng)用程序的可移植性。
????? MOM提供了有保證的消息發(fā)送,應(yīng)用程序開發(fā)者無需了解遠(yuǎn)程過程調(diào)用(PRC)和網(wǎng)絡(luò)/通信協(xié)議的細(xì)節(jié),提供了程序的可移植性。
最大化減少應(yīng)用程序與應(yīng)用系統(tǒng)之間的耦合度。
????? 因為MOM的存在,各個應(yīng)用程序僅僅關(guān)心和MOM之間怎樣進(jìn)行消息的接收與發(fā)送,而無需關(guān)注MOM的還有一邊,其它程序是怎樣接收和發(fā)送的。
JMS兩種消息模型
JMS提供了兩種消息通信模型:
????? ? 點到點(P2P)模型
????? ? 公布/訂閱(Pub/Sub)模型
圖 2 JMS通訊模型
從圖中能夠看出,ClientA和ClientB是消息生產(chǎn)者,通過兩種不同的目的地分別向ClientC、ClientD、ClientE和ClientF發(fā)送消息。
????? 在ClientA、C、D之間的消息是點對點模型,使用這樣的模型,client發(fā)送消息到隊列目的地(Queue),從這個隊列里面僅僅有一個消息接收者能夠收到那個消息,其它訪問同一目的地的接收者不會接收到該消息。如ClientC接收Queue中的Msg1消息,ClientD接收Queue中的Msg2消息。
????? 在ClientB、E、F之間的消息是公布/訂閱模型。使用這樣的廣播模型,一個client發(fā)送消息給主題目的地(Topic),不論什么數(shù)量的消費訂閱者能夠從這個主題目的地來接收它們。如:ClientE和ClientF都接收這個Msg3這條消息。
點到點模型
點對點傳遞模型:生產(chǎn)者發(fā)送消息到一個特定的隊列(Queue)中,而消費者從一個消息隊列中得到消息,例如以下圖所看到的:
圖 3 點到點通訊模型示意圖
點對點模型的特點:
?? 每條消息有一個消費者
????? 每條僅僅有一個消費者,假設(shè)一條消息被消息者接收,那么其它的消費者就不能得到這條消息了。
? 發(fā)送和接受消息與時間沒有關(guān)系
????? 也就是說,生產(chǎn)者在發(fā)送消息后,消費者能夠在隨意的時刻接收,但有兩個前提:
??????????? 1、消息未過期
??????????? 2、消息沒有被其它的用戶接收
????? 消費者也能夠先執(zhí)行,當(dāng)生產(chǎn)者一執(zhí)行,將消息發(fā)送到隊列中,消費者就可以從隊列中獲得消息,這叫“守株待兔“。
?? 消費者必須確認(rèn)對消息的接收
????? 收到消息后消費者必須確認(rèn)消息已被接收,否則JMS服務(wù)提供者會覺得該消息沒有被接收,那么這條消息仍然能夠被其它人接收。程序能夠自己主動進(jìn)行確認(rèn),不須要人工干預(yù)。
?? 非持久的消息最多僅僅發(fā)送一次
????? 非持久的消息最多僅僅發(fā)送一次,表示消息有可能未被發(fā)送,造成未被發(fā)送的原因可能有:
??????????? 1、 JMS服務(wù)提供者出現(xiàn)宕機(jī)等情況,造成非持久信息的丟失
??????????? 2、 隊列中的消息過期,未被接收
?? 持久的消息嚴(yán)格發(fā)送一次
????? 我們能夠?qū)⒈容^重要的消息設(shè)置為持久化的消息,持久化后的消息不會由于JMS服務(wù)提供者的故障或者其它原因造成消息丟失。
公布/訂閱模型
????? 公布/訂閱模型:公布/訂閱傳遞消息類型與主題(Topic)有關(guān)。生產(chǎn)者公布消息,而消費者訂閱感興趣的消息,生產(chǎn)者將消息和一個特定的主題(Topic)連在一起,消息傳遞系統(tǒng)(MOM)依據(jù)消費者注冊的興趣,將消息傳遞給消費者。這樣的類型很相似出版報紙、雜志的形式,例如以下圖所看到的:
圖 4 公布/訂閱通訊模型示意圖
公布/訂閱模型的特點:
?? 每一個消息都能夠有多個(0,1,……)訂閱者
????? 每條消息能夠有多個消費者,假設(shè)報紙和雜志一樣,誰訂閱了誰都能夠獲得。
?? 訂閱者僅僅能消費他們訂閱之后出版的消息
????? 這就要求訂閱者必須先訂閱,生產(chǎn)者再公布。即訂閱者必須先執(zhí)行,再等待生產(chǎn)者的執(zhí)行,這和點對點類型有所差異。
?? 訂閱者必須保持為活動狀態(tài)才干使用這些消息
????? 即訂閱者必須保持活動狀態(tài)等待公布者公布的消息,假設(shè)訂閱者在公布者公布消息之后才執(zhí)行,則不能獲得先前公布者公布的消息。
總結(jié)
以上是生活随笔為你收集整理的深入浅出JMS(一)——JMS简单介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL批量按条件更新不同的数据
- 下一篇: 面向对象的属性