Java消息隊列--JMS概述

1股淡、什么是JMS

JMS即Java消息服務(wù)(Java Message Service)應(yīng)用程序接口菌羽,是一個Java平臺中關(guān)于面向消息中間件(MOM)的API,用于在兩個應(yīng)用程序之間舔清,或分布式系統(tǒng)中發(fā)送消息含友,進(jìn)行異步通信。Java消息服務(wù)是一個與具體平臺無關(guān)的API钮热,絕大多數(shù)MOM提供商都對JMS提供支持(百度百科給出的概述)填抬。我們可以簡單的理解:兩個應(yīng)用程序之間需要進(jìn)行通信,我們使用一個JMS服務(wù)隧期,進(jìn)行中間的轉(zhuǎn)發(fā)飒责,通過JMS 的使用,我們可以解除兩個程序之間的耦合仆潮。

2宏蛉、JMS的優(yōu)勢  

Asynchronous(異步)

JMS is asynchronous by default. So to receive a message, the client? is not required to send the request. The message will arrive

automatically to the client as they become available.(JMS原本就是一個異步的消息服務(wù),客戶端獲取消息的時候性置,不需要主動發(fā)送請求拾并,消息會自動發(fā)送給可用的客戶端)

Reliable(可靠)

JMS provides the facility of assurance that the message will? delivered once and only once. You know that duplicate messages create problems. JMS helps you avoiding such? problems.(JMS保證消息只會遞送一次。大家都遇到過重復(fù)創(chuàng)建消息問題,而JMS能幫你避免該問題嗅义。)

3屏歹、JMS的消息模型

JMS具有兩種通信模式:

  1、Point-to-Point Messaging Domain (點對點)

  2之碗、Publish/Subscribe Messaging Domain (發(fā)布/訂閱模式)

在JMS API出現(xiàn)之前蝙眶,大部分產(chǎn)品使用“點對點”和“發(fā)布/訂閱”中的任一方式來進(jìn)行消息通訊。JMS定義了這兩種消息發(fā)送模型的規(guī)范褪那,它們相互獨立幽纷。任何JMS的提供者可以實現(xiàn)其中的一種或兩種模型,這是它們自己的選擇博敬。JMS規(guī)范提供了通用接口保證我們基于JMS API編寫的程序適用于任何一種模型友浸。

(1)、Point-to-Point Messaging Domain(點對點通信模型)

      a冶忱、模式圖:

?????????????????????? b尾菇、涉及到的概念:

        在點對點通信模式中境析,應(yīng)用程序由消息隊列囚枪,發(fā)送方,接收方組成劳淆。每個消息都被發(fā)送到一個特定的隊列链沼,接收者從隊列中獲取消息。隊列保留著消息沛鸵,直到他們被消費(fèi)或超時括勺。

      c、特點:

每個消息只要一個消費(fèi)者

發(fā)送者和接收者在時間上是沒有時間的約束曲掰,也就是說發(fā)送者在發(fā)送完消息之后疾捍,不管接收者有沒有接受消息,都不會影響發(fā)送方發(fā)送消息到消息隊列中栏妖。

發(fā)送方不管是否在發(fā)送消息乱豆,接收方都可以從消息隊列中去到消息(The receiver can fetch message whether it is running or not when the sender sends the message)

接收方在接收完消息之后,需要向消息隊列應(yīng)答成功

(2)吊趾、Publish/Subscribe Messaging Domain(發(fā)布/訂閱通信模型)

      a宛裕、模式圖:

????????????????????? b、涉及到的概念:

        在發(fā)布/訂閱消息模型中论泛,發(fā)布者發(fā)布一個消息揩尸,該消息通過topic傳遞給所有的客戶端。該模式下屁奏,發(fā)布者與訂閱者都是匿名的岩榆,即發(fā)布者與訂閱者都不知道對方是誰。并且可以動態(tài)的發(fā)布與訂閱Topic。Topic主要用于保存和傳遞消息朗恳,且會一直保存消息直到消息被傳遞給客戶端湿颅。

      c、特點:

???????????????????????????? 一個消息可以傳遞個多個訂閱者(即:一個消息可以有多個接受方)

?????????????????????????? 發(fā)布者與訂閱者具有時間約束粥诫,針對某個主題(Topic)的訂閱者油航,它必須創(chuàng)建一個訂閱者之后,才能消費(fèi)發(fā)布者的消息怀浆,而且為了消費(fèi)消息谊囚,訂閱者必須保持運(yùn)行的狀態(tài)。

?????????????????????????? 為了緩和這樣嚴(yán)格的時間相關(guān)性执赡,JMS允許訂閱者創(chuàng)建一個可持久化的訂閱镰踏。這樣,即使訂閱者沒有被激活(運(yùn)行)沙合,它也能接收到發(fā)布者的消息奠伪。

4、JMS接收消息

    在JMS中首懈,消息的產(chǎn)生和消息是異步的绊率。對于消費(fèi)來說,JMS的消息者可以通過兩種方式來消費(fèi)消息究履。

   ÷朔瘛(1)、同步(Synchronous)

        在同步消費(fèi)信息模式模式中最仑,訂閱者/接收方通過調(diào)用?receive()方法來接收消息藐俺。在receive()方法中,線程會阻塞直到消息到達(dá)或者到指定時間后消息仍未到達(dá)泥彤。

   ∮邸(2)、異步(Asynchronous)

        使用異步方式接收消息的話吟吝,消息訂閱者需注冊一個消息監(jiān)聽者菱父,類似于事件監(jiān)聽器,只要消息到達(dá)爸黄,JMS服務(wù)提供者會通過調(diào)用監(jiān)聽器的onMessage()遞送消息滞伟。

5、JMS編程模型

管理對象(Administered objects)-連接工廠(Connection Factories)和目的地(Destination)

連接對象(Connections)

會話(Sessions)

消息生產(chǎn)者(Message Producers)

消息消費(fèi)者(Message Consumers)

消息監(jiān)聽者(Message Listeners)


】还蟆(1)梆奈、Connection Factories

        創(chuàng)建Connection對象的工廠,針對兩種不同的jms消息模型称开,分別有QueueConnectionFactory和TopicConnectionFactory兩種亩钟∨依妫可以通過JNDI來查找ConnectionFactory對象∏逅郑客戶端使用一個連接工廠對象連接到JMS服務(wù)提供者扶镀,它創(chuàng)建了JMS服務(wù)提供者和客戶端之間的連接。JMS客戶端(如發(fā)送者或接受者)會在JNDI名字空間中搜索并獲取該連接焰轻。使用該連接臭觉,客戶端能夠與目的地通訊,往隊列或話題發(fā)送/接收消息辱志。

QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");

Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue");

Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");

   ◎鹬(2)、Destination

?        目的地指明消息被發(fā)送的目的地以及客戶端接收消息的來源揩懒。JMS使用兩種目的地什乙,隊列和話題。如下代碼指定了一個隊列和話題:

    創(chuàng)建一個隊列Session:

QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);//get the Queue object? Queue t = (Queue) ctx.lookup ("myQueue");//create QueueReceiver? QueueReceiver receiver = ses.createReceiver(t);

   ∫亚颉(3)臣镣、Connection

      Connection表示在客戶端和JMS系統(tǒng)之間建立的鏈接(對TCP/IP

socket的包裝)。Connection可以產(chǎn)生一個或多個Session智亮。跟ConnectionFactory一樣忆某,Connection也有兩種類型:QueueConnection和TopicConnection。

      連接對象封裝了與JMS提供者之間的虛擬連接鸽素,如果我們有一個ConnectionFactory對象褒繁,可以使用它來創(chuàng)建一個連接亦鳞。

Connection connection = connectionFactory.createConnection();

   ♀珊觥(4)、Session

      Session 是我們對消息進(jìn)行操作的接口燕差,可以通過session創(chuàng)建生產(chǎn)者遭笋、消費(fèi)者、消息等徒探。Session 提供了事務(wù)的功能瓦呼,如果需要使用session發(fā)送/接收多個消息時,可以將這些發(fā)送/接收動作放到一個事務(wù)中测暗。

      我們可以在連接創(chuàng)建完成之后創(chuàng)建session:

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

      這里面提供了參數(shù)兩個參數(shù)央串,第一個參數(shù)是是否支持事務(wù),第二個是事務(wù)的類型

   ⊥胱摹(5)质和、Producter

      消息生產(chǎn)者由Session創(chuàng)建,用于往目的地發(fā)送消息稚字。生產(chǎn)者實現(xiàn)MessageProducer接口饲宿,我們可以為目的地厦酬、隊列或話題創(chuàng)建生產(chǎn)者;

MessageProducer producer = session.createProducer(dest);

MessageProducer producer = session.createProducer(queue);

MessageProducer producer = session.createProducer(topic);

   √毕搿(6)仗阅、Consumer

      消息消費(fèi)者由Session創(chuàng)建,用于接收被發(fā)送到Destination的消息国夜。

MessageConsumer consumer = session.createConsumer(dest);

MessageConsumer consumer = session.createConsumer(queue);

MessageConsumer consumer = session.createConsumer(topic);

   〖踉搿(7)、MessageListener

      消息監(jiān)聽器车吹。如果注冊了消息監(jiān)聽器旋廷,一旦消息到達(dá),將自動調(diào)用監(jiān)聽器的onMessage方法礼搁。EJB中的MDB(Message-Driven Bean)就是一種MessageListener饶碘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馒吴,隨后出現(xiàn)的幾起案子扎运,更是在濱河造成了極大的恐慌,老刑警劉巖饮戳,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豪治,死亡現(xiàn)場離奇詭異,居然都是意外死亡扯罐,警方通過查閱死者的電腦和手機(jī)负拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歹河,“玉大人掩浙,你說我怎么就攤上這事〗掌纾” “怎么了厨姚?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長键菱。 經(jīng)常有香客問我谬墙,道長,這世上最難降的妖魔是什么经备? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任拭抬,我火速辦了婚禮,結(jié)果婚禮上侵蒙,老公的妹妹穿的比我還像新娘造虎。我一直安慰自己,他們只是感情好蘑志,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布累奈。 她就那樣靜靜地躺著贬派,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澎媒。 梳的紋絲不亂的頭發(fā)上搞乏,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音戒努,去河邊找鬼请敦。 笑死,一個胖子當(dāng)著我的面吹牛储玫,可吹牛的內(nèi)容都是我干的侍筛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼撒穷,長吁一口氣:“原來是場噩夢啊……” “哼匣椰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起端礼,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤禽笑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛤奥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佳镜,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年凡桥,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟀伸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡缅刽,死狀恐怖啊掏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拷恨,我是刑警寧澤脖律,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布谢肾,位于F島的核電站腕侄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芦疏。R本人自食惡果不足惜冕杠,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酸茴。 院中可真熱鬧分预,春花似錦、人聲如沸薪捍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凳干,卻和暖如春晴裹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背救赐。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工涧团, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人经磅。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓泌绣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親预厌。 傳聞我的和親對象是個殘疾皇子阿迈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容