JMS学习(三)JMS 消息结构之属性及消息体详解
一、前言
通過(guò)上一篇的學(xué)習(xí)我們知道了消息分為三個(gè)部分,即消息頭,屬性及消息體,并對(duì)消息頭的十個(gè)屬性進(jìn)行了詳細(xì)的介紹,本文再對(duì)消息屬性及消息體進(jìn)行詳細(xì)的介紹。
二、屬性介紹
消息屬性的主要作用是可以對(duì)頭信息進(jìn)行一個(gè)額外的補(bǔ)充,畢竟消息頭信息一是有限,二是很多不能由應(yīng)用程序設(shè)定。通常,消息屬性可以用在消息選擇器的表達(dá)式里,結(jié)合起來(lái)實(shí)現(xiàn)對(duì)消息的過(guò)濾。
消息屬性的值只能是基本的類型,或者這些基本類型對(duì)應(yīng)的包裝類型。也就是說(shuō),不能將一個(gè)自定義的對(duì)象作為屬性值。通常情況下,如果能夠放在body里的內(nèi)容,就不必放在消息屬性里。
消息屬性按類型可以分為標(biāo)準(zhǔn)屬性(JMSX作為前綴),消息組件自定義的屬性(JMS_作為前綴),以及應(yīng)用自定義的屬性。自定義的屬性不要以前面兩種為前綴。
標(biāo)準(zhǔn)的JMSX屬性如下表:
其中,JMSXGroupID和JMSGroupSeq是客戶端可以設(shè)置的。消息的屬性一旦設(shè)置,且消息發(fā)送后,就會(huì)變成只讀的,將不能再被修改。
跟頭信息的設(shè)置不同的是,對(duì)于這些標(biāo)準(zhǔn)屬性,JMS并不要求消息中間件必須設(shè)置這些屬性,所以這些屬性的值可能是存在的,也可能為空,而且經(jīng)測(cè)試大部分的標(biāo)準(zhǔn)屬性都可以由應(yīng)用程序自行設(shè)置,就像自定義的屬性一樣。
三、消息體
為了適應(yīng)不同場(chǎng)景下的消息,提高消息存儲(chǔ)的靈活性,JMS定義了幾種具體類型的消息,不同的子類型的消息體也不一樣,需要注意的是,Message接口并沒(méi)有提供一個(gè)統(tǒng)一的getBody之類的方法。消息子接口定義如下:
1)TextMessage: 最簡(jiǎn)單的消息接口,用于發(fā)送文本類的消息,設(shè)置/獲取其body的方法定義如下setText()/getText().
2)StreamMessage: 流式消息接口,里面定義了一系列的對(duì)基本類型的set/get方法,消息發(fā)送者可以通過(guò)這些方法寫(xiě)入基本類型的數(shù)據(jù),消息接收者需要按發(fā)送者的寫(xiě)入順序來(lái)讀取相應(yīng)的數(shù)據(jù)。
3)MapMessage:把消息內(nèi)容存儲(chǔ)在Map里,本接口定義了一系列對(duì)基本類型的的set/get方法,與StreamMessage不同的是,每個(gè)值都對(duì)應(yīng)了一個(gè)相應(yīng)的key,所以消息接收者不必按順序去讀取數(shù)據(jù)。
4)ObjectMessage: 將對(duì)象作為消息的接口,提供了一個(gè)set/get 對(duì)象的方法,需要注意的是只能設(shè)置一個(gè)對(duì)象,這個(gè)對(duì)象可以是一個(gè)Collection,但必須是序列化的。
5)BytesMessage:以字節(jié)的形式來(lái)傳遞消息的接口,除了提供了對(duì)基本類型的set/get,還提供了按字節(jié)方式進(jìn)行set/get。
三、小結(jié)
消息屬性是對(duì)消息頭信息的一種補(bǔ)充,相對(duì)來(lái)說(shuō)更加靈活,通常情況下,我們不應(yīng)該依賴標(biāo)準(zhǔn)的屬性值,如果應(yīng)用需要,我們也應(yīng)該自定義所需要的屬性值。
JMS提供的5種子消息接口讓我們?cè)诎l(fā)送消息時(shí)有了更多的選擇,可以根據(jù)應(yīng)用的實(shí)際需要來(lái)選擇對(duì)應(yīng)的子接口。
總結(jié)
以上是生活随笔為你收集整理的JMS学习(三)JMS 消息结构之属性及消息体详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SAP CRM WebClient UI
- 下一篇: 看完知乎上500条答案,我为大家整理了这