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
介紹流程:
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消息頭中滥沫。
如之前所說(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ī)范為使用這些屬性提供的唯一建議 是JMSXGroupID 和 JMSXGroupSeq 屬性,并且當(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)
- Publish/Subscribe(Pub/Sub)
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它掂。 |
如下圖:
其他專題:
Redis:http://www.reibang.com/nb/32287093