Apache RocketMQ之JMS基本概念及使用

1.png

Apache RocketMQ之JMS基本概念及使用

Apache RocketMQ 系列:

Apache RocketMQ之JMS基本概念及使用:http://www.reibang.com/p/d2e3fd77c4f4
Apache RocketMQ 基礎(chǔ)概念及架構(gòu)解析:http://www.reibang.com/p/95ab928960b3
Apache RocketMQ 的基礎(chǔ)特性介紹:http://www.reibang.com/p/570680b32590
Apache RocketMQ 集群搭建(兩主兩從):http://www.reibang.com/p/b090138cf52c
Apache RocketMQ 刷盤策略與復(fù)制策略: http://www.reibang.com/p/d66b381428bb


優(yōu)秀博客:

https://blog.csdn.net/canot/article/details/53676350

https://blog.csdn.net/caidaoqq/article/details/45938919

https://blog.csdn.net/u013123635/article/details/78362360


介紹流程:

8.png

RocketMQ 是什么?

是一個(gè)隊(duì)列模型的消息中間件咒钟,具有高性能炭序、高可靠财破、高實(shí)時(shí)、分布式特點(diǎn)稳衬。
RocketMQ是一個(gè)消息中間件牲迫,那什么是消息中間件验游?
  • 關(guān)注于數(shù)據(jù)的發(fā)送與接收,利用高效可靠的異步消息傳遞機(jī)制集成分布式系統(tǒng)泄隔。

  • 對(duì)于消息中間件拒贱,常見(jiàn)的角色大致也就有Producer(生產(chǎn)者)、Consumer(消費(fèi)者)

消息+中間件
  • 消息:消息即為數(shù)據(jù)佛嬉,數(shù)據(jù)就會(huì)有規(guī)劃逻澳,有長(zhǎng)度,有大小暖呕。
  • 中間件:為我們提供發(fā)送消息的程序或者服務(wù).

消息:

JMS(Java Message Service)
  • Java消息服務(wù)應(yīng)用程序接口斜做,是一個(gè)Java平臺(tái)中關(guān)于面向消息中間件(Message Oriented Middleware)的API

  • 用于在兩個(gè)應(yīng)用程序之間湾揽,或分布式系統(tǒng)中發(fā)送消息瓤逼,進(jìn)行異步通信。

  • Java消息服務(wù)是一個(gè)與具體平臺(tái)無(wú)關(guān)的API钝腺,絕大多數(shù)MOM提供商都對(duì)JMS提供支持抛姑。

  • JMS允許應(yīng)用程序組件基于JavaEE平臺(tái)創(chuàng)建、發(fā)送艳狐、接收和讀取消息定硝。它使分布式通信耦合度更低,消息服務(wù)更加可靠以及異步性毫目。

在提到JMS時(shí)蔬啡,我們通常會(huì)說(shuō)到一些術(shù)語(yǔ),解釋如下:
  • 消息中間件(JMS Provider) : 指提供了對(duì)JMS協(xié)議的第三方組件镀虐,比如RocketMQ就是一個(gè)消息中間件箱蟆,另外比較知名的還有KafKa、 Rabbit MQ刮便、ActiveMQ等空猜。

  • 消息(Message): 通信內(nèi)容的載體,其結(jié)構(gòu)主要分為消息頭,屬性和消息體辈毯,并且根據(jù)存儲(chǔ)結(jié)構(gòu)的不同分為好幾種坝疼,后面會(huì)詳細(xì)提到。

  • 消息模式:分為點(diǎn)對(duì)點(diǎn)(Point to Point谆沃,即P2P)和發(fā)布/訂閱(Pub/Sub)钝凶,對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)分別是隊(duì)列(Queue)和主題(Topic)

  • 消息生產(chǎn)者:產(chǎn)生消息的一方,在P2P模式下唁影,指消息發(fā)送者(Sender)耕陷,在P/S模式下指消息發(fā)布者(Publisher)

  • 消息消費(fèi)者:接收消息的一方,對(duì)應(yīng)于兩種模式分別是消息接收者(Receiver)和消息訂閱者(Subscriber)


中間件:

  • 為我們提供發(fā)送消息的程序或者服務(wù)据沈,
  • 目前主流的有 rocketMq 哟沫、kafka、rabbitMq卓舵、activemq等南用。

JMS基本概念及原理詳解

基本概念:

  • JMS的客戶端之間可以通過(guò)JMS服務(wù)進(jìn)行異步的消息傳輸。

體系架構(gòu)

JMS由以下元素組成掏湾。

元素 描述
JMS提供者 連接面向消息中間件的裹虫,JMS接口的一個(gè)實(shí)現(xiàn)。提供者可以是Java平臺(tái)的JMS實(shí)現(xiàn)融击,也可以是非Java平臺(tái)的面向消息中間件的適配器筑公。
JMS客戶 生產(chǎn)或消費(fèi)消息的基于Java的應(yīng)用程序或?qū)ο蟆?/td>
JMS生產(chǎn)者 創(chuàng)建并發(fā)送消息的JMS客戶。
JMS消費(fèi)者 接收消息的JMS客戶尊浪。
JMS消息 包括可以在JMS客戶之間傳遞的數(shù)據(jù)的對(duì)象匣屡。
JMS隊(duì)列 一個(gè)容納那些被發(fā)送的等待閱讀的消息的區(qū)域。這些消息將按照順序發(fā)送拇涤,一旦一個(gè)消息被閱讀捣作,該消息將被從隊(duì)列中移走。
JMS主題 一種支持發(fā)送消息給多個(gè)訂閱者的機(jī)制鹅士。

JMS 消息(Message)
  • 每個(gè)在JMS規(guī)范中概念都是圍繞處理一個(gè)JMS消息券躁,因?yàn)樗藰I(yè)務(wù)數(shù)據(jù)和事件是怎么被傳輸?shù)摹?/p>

  • JMS消息允許任何內(nèi)容作為其一部分發(fā)送消息,包括文本和二進(jìn)制數(shù)據(jù)以及標(biāo)題中的信息掉盅。

  • JMS消息包含三部分也拜,包括消息頭、消息的屬性和消息載體(類似于我們常用的大部分協(xié)議趾痘,如http等)慢哈。

  • 消息頭提供消息的接受端和發(fā)送端兩個(gè)客戶端和JMS規(guī)范的元數(shù)據(jù)。

  • 消息載體是消息的實(shí)際內(nèi)容永票,并且可以保存文本和承載了各種各樣數(shù)據(jù)的二進(jìn)制數(shù)據(jù)(如圖片,流等等)卵贱。

  • JMS消息設(shè)計(jì)宗旨是在易于理解和可擴(kuò)展,所有的復(fù)雜的內(nèi)容包含在JMS消息頭中滥沫。

4.png

如之前所說(shuō)的,JMS消息的復(fù)雜性在消息頭中艰赞,消息頭有兩種類型的報(bào)文頭佣谐,它們具有相同的邏輯概念,但是語(yǔ)義上不同的方妖。
  • 由JMS規(guī)范提供的,客戶端調(diào)用send()方法時(shí)罚攀,自動(dòng)設(shè)置的消息頭党觅。

  • 開(kāi)發(fā)者分配的消息頭。

標(biāo)準(zhǔn)的JMS消息頭與JMS API提供的方法一起工作斋泄。大多數(shù)頭信息是被自動(dòng)分配的杯瞻。
接下來(lái)描述每個(gè)頭的含義,以及如何被分配到消息中的炫掐。

客戶端調(diào)用send()方法時(shí)魁莉,自動(dòng)設(shè)置的消息頭。

JMSDestination

  • JMS發(fā)送消息的目的地募胃。這對(duì)于使用來(lái)自多個(gè)目的地的消息的客戶端很有價(jià)值旗唁。

  • 使用一個(gè)Topic或Queue對(duì)象來(lái)標(biāo)識(shí)目的地,二者都是Destination類型

  • 相關(guān)方法:public abstract Destination getJMSDestination()

JMSDeliveryMode

  • JMS傳送模式痹束。支持兩種模式:持久模式和非持久模式检疫。默認(rèn)的傳遞模式是持久。

  • 一條持久性消息應(yīng)該被傳送“一次而且僅僅一次”祷嘶,這就意味著如果JMS提供者出現(xiàn)故障屎媳,該消息并不會(huì)丟失;它會(huì)在服務(wù)器恢復(fù)正常之后再次傳送论巍。一條非持久性消息最多只會(huì)傳送一次烛谊,這意味著如果JMS提供者出現(xiàn)故障,該消息可能會(huì)永久丟失嘉汰。在持久性和非持久性者兩種傳送模式中丹禀,消息服務(wù)器都不會(huì)講一條消息向同一消費(fèi)者發(fā)送一次以上,不過(guò)郑现,這在技術(shù)上最有可能實(shí)現(xiàn)的湃崩。

  • Persistent:持久模式,通知消息提供者去持久化消息接箫。即使消息提供者掛掉攒读,消息也不會(huì)丟失。在這個(gè)模式下辛友,JMS提供者必須對(duì)消息進(jìn)行持久化并且只進(jìn)行一次薄扁。如果JMS提供者掛了剪返,此時(shí)該JMS提供者的消息并不會(huì)丟失,但消息只能被消費(fèi)者使用一次邓梅。
    由于持久化消息提供了額外的可靠性保護(hù)脱盲,因此也需要更多的空間和性能消耗。

  • Nonpersistent:非持久模式日缨, 使得JMS提供者不需求持久化消息钱反。JMS提供者必須最多傳遞一次非持久消息。如果JMS提供者掛了匣距,此時(shí)該JMS提供者的消息會(huì)丟失面哥,但不會(huì)出現(xiàn)第二次。非持久消息會(huì)提供更高的性能和較低的可靠性毅待。

  • 發(fā)送模式在消息發(fā)送者上設(shè)置尚卫,并應(yīng)用于從發(fā)送的所有消息。 但是也可以針對(duì)單個(gè)消息覆蓋發(fā)送模式尸红。

  • 相關(guān)方法public abstract int getJMSDeliveryMode()

JMSMessageID

  • JMS消息ID吱涉。它是一個(gè)String類型的值,唯一標(biāo)識(shí)了一條消息外里,并且必須以ID開(kāi)頭怎爵。

  • JMSMessageID對(duì)于JMS中消費(fèi)者應(yīng)用程序的歷史倉(cāng)庫(kù)來(lái)說(shuō)非常有用,它是倉(cāng)庫(kù)中的消息需要的唯一索引级乐。

  • 因?yàn)橄D可能導(dǎo)致JMS提供程序產(chǎn)生一些開(kāi)銷疙咸,消息提供者可以建議JMS提供程序,JMS應(yīng)用程序不依賴于這個(gè)消息頭的值风科。

  • 通過(guò) MessageProducer.setDisableMessageID()方法設(shè)置撒轮。

  • 如果JMS提供程序同意該建議,則消息標(biāo)識(shí)必須設(shè)置為null贼穆。但JMS提供程序可以忽略此調(diào)用并始終分配消息ID题山。

  • 相關(guān)方法public abstract String getJMSMessageID()

JMSTimestamp

  • JMS時(shí)間戳。它包含的是JMS提供者接受消息的時(shí)間故痊,而不是該消息實(shí)際傳送的時(shí)間顶瞳。這條消息頭用于確認(rèn)發(fā)送消息和它被消費(fèi)者實(shí)際接受的時(shí)間間隔。

  • 此標(biāo)頭的值使用標(biāo)準(zhǔn)Java millis時(shí)間值愕秫。

  • 與JMSMessageID頭類似慨菱,JMS提供者建議JMS生產(chǎn)者不設(shè)置JMSTimestamp頭

  • 通過(guò)MessageProducer.setDisableMessageTimestamp()方法設(shè)置,如果JMS生產(chǎn)者接受此建議戴甩,則它則將JMSTimestamp設(shè)置為零符喝。

  • 相關(guān)方法public abstract long getJMSTimestamp()

JMSExpiration

  • JMS消息的超時(shí)時(shí)間。這個(gè)頭信息被用來(lái)阻止過(guò)期消息的傳遞甜孤。對(duì)于那些數(shù)據(jù)僅在某一個(gè)時(shí)間段內(nèi)有效的消息來(lái)說(shuō)协饲,非常有用的畏腕。

  • 消息的超時(shí)值可以使用MessageProducer.setTimeToLive()方法設(shè)置該生產(chǎn)者發(fā)送的所有消息的生存時(shí)間,或使用一個(gè)MessageProducer.send()方法來(lái)設(shè)置單個(gè)消息的超時(shí)值茉稠。調(diào)用這兩個(gè)方法都會(huì)設(shè)置時(shí)間描馅,以毫秒為單位。

  • 通過(guò)將生存時(shí)間添加到JMSExpiration消息頭中來(lái)計(jì)算超時(shí)時(shí)間而线。默認(rèn)情況下铭污,超時(shí)時(shí)間為零,意味著消息不會(huì)過(guò)期吞获。

  • 如果未指定超時(shí)時(shí)間况凉,則使用默認(rèn)值并且消息不會(huì)過(guò)期。如果超時(shí)時(shí)間明確指定為零各拷,那么同樣的消息不會(huì)過(guò)期。

  • 此消息頭對(duì)于時(shí)間敏感的消息很有用闷营。但要注意烤黍,JMS提供者程序不應(yīng)傳遞已過(guò)期的消息和JMS客戶端應(yīng)該被寫入以便不處理已經(jīng)過(guò)期的消息。

  • 相關(guān)方法public abstract long getJMSExpiration()

JMSRedelivered

  • JMS重發(fā)傻盟。表示該消息將被重新傳送給消費(fèi)者速蕊。如果該消息被重新傳送,JMSRedelivered消息頭就為true娘赴,否則為false规哲。

  • 相關(guān)方法public abstract boolean getJMSRedelivered()

JMSPriority

  • JMS優(yōu)先級(jí)。在傳送一條消息時(shí)诽表,消息生產(chǎn)者能夠?yàn)樵撓⒎峙湟粋€(gè)優(yōu)先級(jí)唉锌,這個(gè)頭是也設(shè)置在消息提供者者。
  • 一旦在生產(chǎn)者上設(shè)置了優(yōu)先級(jí)竿奏,適用于從該生產(chǎn)者發(fā)送的所有消息袄简,也可以對(duì)單個(gè)消息進(jìn)行單獨(dú)設(shè)置。

  • JMS定義了10個(gè)級(jí)別的消息優(yōu)先級(jí)泛啸,范圍從 0(最低)到9(最高):

  • 優(yōu)先級(jí)0-4 - 這些優(yōu)先級(jí)是普通優(yōu)先級(jí)绿语。

  • 優(yōu)先級(jí)5-9 - 這些優(yōu)先級(jí)是加急優(yōu)先級(jí)。

  • JMS提供者不需要實(shí)現(xiàn)消息排序候址,盡管大部分情況是需要排序吕粹。

  • 他們應(yīng)該簡(jiǎn)單地嘗試提供更高優(yōu)先級(jí)的消息在低優(yōu)先級(jí)消息之前。

  • 相關(guān)方法public abstract int getJMSPriority()


開(kāi)發(fā)者分配的消息頭:

JMSReplyTo

  • JMS響應(yīng)岗仑。一個(gè)JMS消息生產(chǎn)者可能會(huì)要求消費(fèi)者對(duì)一條消息作出應(yīng)答,JMSReplyTo消息頭包含了一個(gè)javax.jms.Destination匹耕,表明JMS消費(fèi)者應(yīng)該應(yīng)答的地址。

  • 這個(gè)信息頭通常用于消息的請(qǐng)求/回復(fù)模式赔蒲。

  • 已發(fā)送消息使用此標(biāo)題通常希望得到接受者的響應(yīng)泌神,它是可選的頭信息良漱。

  • 客戶端必須做出是否對(duì)發(fā)送者的響應(yīng)。

  • 相關(guān)方法public abstract Destination getJMSReplyTo()欢际。

JMSCorrelationID

  • JMS關(guān)聯(lián)ID母市。提供了一個(gè)消息頭,用于將當(dāng)前的消息和先前的某些消息或應(yīng)用程序特定的ID關(guān)聯(lián)起來(lái)损趋,這個(gè)消息頭通常用于將響應(yīng)消息與請(qǐng)求消息患久。
  • JMSCorrelationID的值可以是以下之一:

  • 特定于提供者的消息ID

  • 應(yīng)用程序特定的字符串

  • 提供程序自身的byte[]值

  • 提供者的消息,以 ID: 為前綴開(kāi)頭浑槽,而應(yīng)用程序特定的消息不能以 ID: 前綴開(kāi)頭蒋失。

  • 如果是JMS提供者支持 native correlation ID的概念,JMS客戶端可能需要分配一個(gè)特定的JMSCorrelationID值桐玻,以匹配非JMS客戶端所期望的值篙挽,但是這不是必須的。

  • 相關(guān)方法public abstract String getJMSCorrelationID()镊靴。

JMSType

  • JMS類型铣卡。用于語(yǔ)義標(biāo)識(shí)消息類型,是由JMS客戶端設(shè)置的一個(gè)可選消息頭偏竟。它的主要作用是標(biāo)示消息結(jié)構(gòu)和有效負(fù)載的類型煮落。

  • 這個(gè)消息頭并未指明正被發(fā)送的消息類型,而是JMS提供者使用的內(nèi)部消息倉(cāng)庫(kù)的一個(gè)條目踊谋。蝉仇。

  • 在使用請(qǐng)求/應(yīng)答場(chǎng)景時(shí),通過(guò)這條消息頭屬性可以進(jìn)一步實(shí)現(xiàn)消息生產(chǎn)者和消息消費(fèi)者之間的去耦殖蚕。

  • 這個(gè)頭信息只有很少?gòu)S商使用并且和消息承載的Java類型無(wú)關(guān)轿衔。

  • 相關(guān)方法public abstract String getJMSType()


消息屬性

  • 消息屬性就像可以分配一條消息的附加消息頭一樣嫌褪。它們?cè)试S開(kāi)發(fā)者添加有關(guān)消息的不透明附加消息呀枢。它們還用于暴露消息選擇器在消息過(guò)濾時(shí)使用的數(shù)據(jù)。

  • message接口為讀取和寫入屬性提供了若干個(gè)取值函數(shù)和賦值函數(shù)方法笼痛。

  • 包括布爾值裙秋,字節(jié),短整型缨伊,長(zhǎng)整型摘刑,浮點(diǎn)型,雙精度型刻坊,以及String對(duì)象類型的方法枷恕。

  • 下面方法取自Message接口。

public interface Message {
    ...
    boolean getBooleanProperty(String name) throws JMSException;
    byte getByteProperty(String name) throws JMSException;
    short getShortProperty(String name) throws JMSException;
    int getIntProperty(String name) throws JMSException;
    long getLongProperty(String name) throws JMSException;
    float getFloatProperty(String name) throws JMSException;
    double getDoubleProperty(String name) throws JMSException;
    String getStringProperty(String name) throws JMSException;
    Object getObjectProperty(String name) throws JMSException;
    ...
    Enumeration getPropertyNames() throws JMSException;
    boolean propertyExists(String name) throws JMSException;
    ...
    void setBooleanProperty(String name, boolean value) throws JMSException;
    void setByteProperty(String name, byte value) throws JMSException;
    void setShortProperty(String name, short value) throws JMSException;
    void setIntProperty(String name, int value) throws JMSException;
    void setLongProperty(String name, long value) throws JMSException;
    void setFloatProperty(String name, float value) throws JMSException;
    void setDoubleProperty(String name, double value) throws JMSException;
    void setStringProperty(String name, String value) throws JMSException;
    void setObjectProperty(String name, Object value) throws JMSException;
    ...
    
}
  • 還要注意用于處理消息上的泛型屬性的兩個(gè)方便方法:
  • getPropertyNames() 方法谭胚,返回給定消息上所有屬性的枚舉徐块,以便輕松地遍歷所有屬性未玻。
  • propertyExists() 方法用于測(cè)試消息上是否存在給定屬性。
  • 注意胡控,特定于JMS的頭部不被認(rèn)為是通用屬性扳剿,也不包含在getPropertyNames()方法返回的枚舉中。

有三種類型的屬性:自定義屬性昼激、JMS定義的屬性和特定于提供者的屬性庇绽。

自定義屬性

  • 自定義屬性是任意的由JMS應(yīng)用程序定義。JMS應(yīng)用程序的開(kāi)發(fā)人員可以通過(guò)使用前一部分
  • getBooleanProperty()/setBooleanProperty()橙困、
  • getStringProperty()/ setStringProperty()
  • 所示的泛型方法瞧掺,自由定義任何必需的Java屬性。

例如:

TextMessage message = pubSession .createTextMessage();
message.setText(userName +":" +text );
message.setStringProperty("username" , userName );
publisher.publish(message );

JMS定義的屬性

  • JMS定義的屬性具有和應(yīng)用程序?qū)傩韵嗤奶匦苑哺担饲罢叽蠖鄶?shù)在消息發(fā)送時(shí)由JMS提供者來(lái)設(shè)置之外JMS定義的屬性可以作為可選的JMS消息頭辟狈;對(duì)于某些另有聲明的例外。各廠商可以分別選擇不支持夏跷、部分支持或全部支持上陕。下面是JMS定義的9個(gè)屬性清單:
屬性 描述
JMSXAppID 標(biāo)識(shí)發(fā)送消息的應(yīng)用程序
JMSXConsumerTXID 使用此消息的事務(wù)的事務(wù)標(biāo)識(shí)符
JMSXDeliveryCount 消息傳遞嘗試的數(shù)量
JMSXGroupID 此消息是其一部分的消息組
JMSXGroupSeq 組中此消息的序列號(hào)
JMSXProducerTXID 生成此消息的事務(wù)的事務(wù)標(biāo)識(shí)符
JMSXRcvTimestamp JMS提供者向消費(fèi)者傳遞消息的時(shí)間
JMSXState 用于定義特定于提供程序的狀態(tài)
JMSXUserID 標(biāo)識(shí)發(fā)送消息的用戶
  • 規(guī)范為使用這些屬性提供的唯一建議 是JMSXGroupIDJMSXGroupSeq 屬性,并且當(dāng)按特定順序?qū)ο⒒蛳⒎纸M時(shí)拓春,客戶端應(yīng)該使用這些屬性。

特定于提供者的屬性

  • 每個(gè)JMS提供者都可以定義一組私有屬性亚隅,這些屬性可以由客戶端或提供者自動(dòng)設(shè)置硼莽。
  • 提供者特定的屬性必須以前綴JMS開(kāi)頭,后面緊接著是屬性名稱煮纵。
  • 提供者特定的屬性懂鸵,其作用就是支持廠商的私有特性。

既然已經(jīng)討論了消息的JMS頭和屬性行疏,那么它們究竟用于什么呢匆光?
  • 在篩選訂閱目的地的客戶端接收的消息時(shí),報(bào)頭和屬性非常重要酿联。

消息體(Message Body)

JMS為消息體定義了六種類型載體,通過(guò)這個(gè)類型,你可以發(fā)送各種各樣的數(shù)據(jù)。
類型 描述
Message 最基礎(chǔ)的消息體,沒(méi)有數(shù)據(jù)載體合住。僅僅包含了消息體和屬性甜无,一般用做簡(jiǎn)單的時(shí)間通知。
TextMessage 文本消息 字符串?dāng)?shù)據(jù)載體喳张。一般用來(lái)發(fā)送簡(jiǎn)單的文本,XML數(shù)據(jù)续镇。
MapMessage key-value鍵值隊(duì)作為數(shù)據(jù)載體。key一般使用字符串销部,value可以為Java原始類型摸航。
BytesMessage 使用一個(gè)二進(jìn)制數(shù)據(jù)來(lái)做數(shù)據(jù)載體制跟。
StreamMessage Java原始類型的流數(shù)據(jù)
ObjectMessage 序列化后的完整Java類。通過(guò)使用與復(fù)雜Java類型酱虎。也支持集合

JMS消息模型 (即點(diǎn)對(duì)點(diǎn)和發(fā)布訂閱模型)

  • Point-to-Point(P2P)
5.png
  • Publish/Subscribe(Pub/Sub)
6.png

JMS應(yīng)用程序接口

接口 描述
ConnectionFactory 接口(連接工廠) 創(chuàng)建Connection對(duì)象的工廠雨膨,根據(jù)消息類型的不同,用戶將使用隊(duì)列連接工廠逢净,或者主題連接工廠分哥放,別有QueueConnectionFactory和TopicConnectionFactory兩種〉粒可以通過(guò)JNDI來(lái)查找ConnectionFactory對(duì)象甥雕。
Destination 接口(目標(biāo)) Destination是一個(gè)包裝了消息目標(biāo)標(biāo)識(shí)符的被管對(duì)象,消息目標(biāo)是指消息發(fā)布和接收的地點(diǎn)胀茵,或者是隊(duì)列社露,或者是主題。是消息生產(chǎn)者的消息發(fā)送目標(biāo)或者說(shuō)消息消費(fèi)者的消息來(lái)源琼娘。對(duì)于消息生產(chǎn)者來(lái)說(shuō)峭弟,它的Destination是某個(gè)隊(duì)列(Queue)或某個(gè)主題(Topic);對(duì)于消息消費(fèi)者來(lái)說(shuō),它的Destination也是某個(gè)隊(duì)列或主題(即消息來(lái)源)脱拼。所以瞒瘸,Destination實(shí)際上就是兩種類型的對(duì)象:Queue、Topic可以通過(guò)JNDI來(lái)查找Destination熄浓。
Connection 接口(連接) Connection表示在客戶端和JMS系統(tǒng)之間建立的鏈接(對(duì)TCP/IP socket的包裝)情臭。Connection可以產(chǎn)生一個(gè)或多個(gè)Session。跟ConnectionFactory一樣赌蔑,Connection也有兩種類型:QueueConnection和TopicConnection俯在。
Session 接口(會(huì)話) Session是我們操作消息的接口。表示一個(gè)單線程的上下文娃惯,用于發(fā)送和接收消息跷乐。由于會(huì)話是單線程的,所以消息是連續(xù)的趾浅,就是說(shuō)消息是按照發(fā)送的順序一個(gè)一個(gè)接收的愕提。可以通過(guò)session創(chuàng)建生產(chǎn)者潮孽、消費(fèi)者揪荣、消息等。Session提供了事務(wù)的功能往史。當(dāng)我們需要使用session發(fā)送/接收多個(gè)消息時(shí)仗颈,可以將這些發(fā)送/接收動(dòng)作放到一個(gè)事務(wù)中。同樣,也分QueueSession和TopicSession挨决。
MessageProducer 接口(消息的生產(chǎn)者) 消息生產(chǎn)者由Session創(chuàng)建请祖,并用于將消息發(fā)送到Destination。消費(fèi)者可以同步地(阻塞模式)脖祈,或異步(非阻塞)接收隊(duì)列和主題類型的消息肆捕。同樣,消息生產(chǎn)者分兩種類型:QueueSender和TopicPublisher盖高∩髁辏可以調(diào)用消息生產(chǎn)者的方法(send或publish方法)發(fā)送消息。
MessageConsumer 接口(消息消費(fèi)者) 消息消費(fèi)者由Session創(chuàng)建喻奥,用于接收被發(fā)送到Destination的消息席纽。兩種類型:QueueReceiver和TopicSubscriber∽膊希可分別通過(guò)session的createReceiver(Queue)或createSubscriber(Topic)來(lái)創(chuàng)建润梯。當(dāng)然,也可以session的creatDurableSubscriber方法來(lái)創(chuàng)建持久化的訂閱者甥厦。
Message 接口(消息) 是在消費(fèi)者和生產(chǎn)者之間傳送的對(duì)象纺铭,也就是說(shuō)從一個(gè)應(yīng)用程序創(chuàng)送到另一個(gè)應(yīng)用程序。一個(gè)消息有三個(gè)主要部分:1刀疙、消息頭(必須):包含用于識(shí)別和為消息尋找路由的操作設(shè)置舶赔。2、一組消息屬性(可選):包含額外的屬性谦秧,支持其他提供者和用戶的兼容顿痪。可以創(chuàng)建定制的字段和過(guò)濾器(消息選擇器)油够。3、一個(gè)消息體(可選):允許用戶創(chuàng)建五種類型的消息(文本消息征懈,映射消息石咬,字節(jié)消息,流消息和對(duì)象消息)卖哎。消息接口非常靈活鬼悠,并提供了許多方式來(lái)定制消息的內(nèi)容。
MessageListener 消息監(jiān)聽(tīng)器亏娜。如果注冊(cè)了消息監(jiān)聽(tīng)器焕窝,一旦消息到達(dá),將自動(dòng)調(diào)用監(jiān)聽(tīng)器的onMessage方法维贺。EJB中的MDB(Message-Driven Bean)就是一種MessageListener它掂。
如下圖:
7.png

其他專題:
Redis:http://www.reibang.com/nb/32287093


如果有問(wèn)題,請(qǐng)留言!
如需轉(zhuǎn)載虐秋,請(qǐng)注明榕茧,謝謝!
感覺(jué)有幫助可以點(diǎn)下喜歡 客给!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末用押,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靶剑,更是在濱河造成了極大的恐慌蜻拨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桩引,死亡現(xiàn)場(chǎng)離奇詭異缎讼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)阐污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門休涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人笛辟,你說(shuō)我怎么就攤上這事功氨。” “怎么了手幢?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵捷凄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我围来,道長(zhǎng)跺涤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任监透,我火速辦了婚禮桶错,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胀蛮。我一直安慰自己院刁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布粪狼。 她就那樣靜靜地躺著退腥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪再榄。 梳的紋絲不亂的頭發(fā)上狡刘,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音困鸥,去河邊找鬼嗅蔬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的购城。 我是一名探鬼主播吕座,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘪板!你這毒婦竟也來(lái)了吴趴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侮攀,失蹤者是張志新(化名)和其女友劉穎锣枝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體兰英,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撇叁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畦贸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨闹。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖薄坏,靈堂內(nèi)的尸體忽然破棺而出趋厉,到底是詐尸還是另有隱情,我是刑警寧澤胶坠,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布君账,位于F島的核電站,受9級(jí)特大地震影響沈善,放射性物質(zhì)發(fā)生泄漏乡数。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一闻牡、第九天 我趴在偏房一處隱蔽的房頂上張望净赴。 院中可真熱鬧,春花似錦罩润、人聲如沸劫侧。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至写妥,卻和暖如春拳球,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珍特。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工祝峻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓莱找,卻偏偏與公主長(zhǎng)得像酬姆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奥溺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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