年比較新的java jms教程_第1頁(yè)
年比較新的java jms教程_第2頁(yè)
年比較新的java jms教程_第3頁(yè)
年比較新的java jms教程_第4頁(yè)
年比較新的java jms教程_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄第 1 章1.11.2JMS基本概念1JMS(JAVA MESSAGE SERVICE)?1JMS中的消息(MESSAGING)?11.3 如何實(shí)現(xiàn)JMS客戶(hù)端程序的跨性?2有關(guān)兩種消息方式簡(jiǎn)介2開(kāi)發(fā)一個(gè)基于JMS的消息客戶(hù)端應(yīng)用的編程步驟41.6 有關(guān)多線(xiàn)程方面. 4第 2 章 JMS 消息模型62.1 背景:62.2 目標(biāo):6JMS 消息6消息頭字段7JMSDestination7JMSDeliveryMode7JMSMessageID72.4.4 JMSTimest. 7JMSCorrelationID8JMSReplyTo8JMSRedelivered9JMSType9JMSExp

2、iration9JMSPriority9對(duì)消息頭信息如何被設(shè)置的總結(jié)10重載消息頭字段10消息屬性102.5.12.5.22.5.32.5.42.5.52.5.62.5.72.5.8屬性名10屬性值10使用屬性11屬性值的轉(zhuǎn)換11屬性值作為對(duì)象11屬性迭代12清空消息屬性值12不存在的屬性12JMS定義的屬性12提供者指定的屬性14MESSAGE 確認(rèn)14消息接口14MESSAGE 選擇14Message 選擇器14消息選擇語(yǔ)法15Null Values 空值18特別說(shuō)明182.9被發(fā)送的消息19I改變已接收的消息的值19JMS消息體19清空消息體20“只讀消息體”20由StreamMessa

3、ge和MapMessage提供的轉(zhuǎn)換功能20第 3 章 JMS通用設(shè)施22ADMINISTERED OBJECTS被管理的對(duì)象22Destination目的地22ConnectionFactory連接工廠。23CONNECTION 連接23Authentication認(rèn)證23Cnt Identifier客戶(hù)端標(biāo)識(shí)23Connection Setup連接的建立243.2.4 Pausing Delivery ofing Messages 停止傳送即將到來(lái)的消息243.2.5 Closing a Connection 關(guān)閉連接253.2.6 Sess 會(huì)話(huà)263.2.7 ConnectionMet

4、aData263.2.8 ExceptionListener異常器263.3 SES會(huì)話(huà)263.3.1 Closing a Ses關(guān)閉會(huì)話(huà)27MessageProducer 和 MessageConsumer 的創(chuàng)建28Creating Temporary Destinations 創(chuàng)建臨時(shí)目的地28Creating Destination Objects創(chuàng)建目的地對(duì)象。28Optimized Message ImplemenConventions for Using a Sesions優(yōu)化消息的實(shí)現(xiàn)。28使用Ses的常規(guī)283.3.7 Tranions 事務(wù)293.3.8 Distribut

5、ed Tranions 分布事務(wù)303.3.9 Multiple Sess 多會(huì)話(huà)30Message Order 消息順序30Message Acknowledgment 消息確認(rèn)31Duplicate Delivery of Messages 重復(fù)的消息傳送32Duplicate Production of Messages 重復(fù)的消息生產(chǎn)323.3.14 Serial Execution of Cnt Code 順序執(zhí)行客戶(hù)端代碼323.3.15 Concurrent Message Delivery 并發(fā)消息傳送33MESSAGECONSUMER 消息消費(fèi)者33Synchronous D

6、elivery 同步傳送33Asynchronous Delivery 異步傳送33MESSAGEPRODUCER 消息生產(chǎn)者34MESSAGE DELIVERY MODE 消息傳送模式34MESSAGE TIME-TO-LIVE 消息存活時(shí)間35EXCEPTIONS 異常35RELIABILITY 可靠性35第 4 章 JMS點(diǎn)對(duì)點(diǎn)傳輸模式37OVERVIEW概述37QUEUE MANAGEMENT(隊(duì)列管理)37IIQUEUE(隊(duì)列)38TEMPORARYQUEUE38QUEUECONNECTIONFACTORY38QUEUECONNECTION384.7 QUEUESES. 38QUEU

7、ERECEIVER38QUEUEBROWSER39QUEUEREQUESTOR39RELIABILITY 可靠性39第 5 章 JMS發(fā)布訂閱(PUBLISH/SUBSCRIBE)模式40OVERVIEW概述40PUB/SUB LATENCY 延遲40DURABLE SUBSCRIPTION 持久化的訂閱415.4 TOPIC MANAGEMENT管理415.5 TOPIC. 41TEMPORARYTOPIC42TOPICCONNECTIONFACTORY42TOPICCONNECTION425.9 TOPICSES. 42TOPICPUBLISHER42TOPICSUBSCRIBER435.

8、11.1 Durable TopicSubscriber 持久化的訂閱43RECOVERY AND REDELIVERY 恢復(fù)和重發(fā)43ADMINISTERING SUBSCRIPTIONS 管理定閱44TOPICREQUESTOR44RELIABILITY 可靠性44第 6 章 SUN MQ安裝及配置466.1 安裝注意事項(xiàng)466.2 JMS 服務(wù)管理并創(chuàng)建各種目的地對(duì)象466.2.1 創(chuàng)建JMS服務(wù)管理. 466.2.2 創(chuàng)建目的地486.3 配置開(kāi)發(fā)所需環(huán)境486.3.1 建立基于JNDI的管理對(duì)象環(huán)境486.3.2 在LDAP中目的地和連接工廠51第 7 章 基于發(fā)布/訂閱模式的應(yīng)用范

9、例537.1 背景537.2 實(shí)現(xiàn)53III第1章JMS 基本概念1.1JMS(Java Message Service)?JMS 為 Java 程序提供了一種創(chuàng)建、發(fā)送、接收和法。企業(yè)消息系統(tǒng)中消息的通用方企業(yè)消息產(chǎn)品(有時(shí)也被稱(chēng)為面向消息的中間件MOM-MessageOriented Middleware),正成為一種用來(lái)整合公司操作的重要組件。它們使得分離的業(yè)務(wù)組件變成可靠而又靈活性的系統(tǒng)。Java語(yǔ)言編寫(xiě)的客戶(hù)端以及中間層服務(wù)必須能夠這些系統(tǒng),JMS 為java語(yǔ)言這些消息系統(tǒng)提供了一種通用的方法。JMS是一系列的接口及相關(guān)語(yǔ)義的集合,通過(guò)這些接口和語(yǔ)義定義了JMS客戶(hù)端如何消息系統(tǒng)。

10、去1.2JMS 中的消息(Messaging)?消息這個(gè)術(shù)語(yǔ)在計(jì)算機(jī)系統(tǒng)中含義非常廣泛,它被不同的操作系統(tǒng)概念,它被郵件和傳真。而在這里,它指的是用于企業(yè)應(yīng)用間的異步通訊。這里所說(shuō)的“消息”是指被企業(yè)應(yīng)用而不是人所消費(fèi)的異步的請(qǐng)求、以及事件。消息中包含了重要的用來(lái)系統(tǒng)間進(jìn)行協(xié)作的信息。消息中包含了精確的數(shù)據(jù)格式以描述特定的業(yè)務(wù)活動(dòng),通過(guò)應(yīng)用系統(tǒng)之間的消息交互,使得企業(yè)業(yè)務(wù)過(guò)程能夠保持一致。JMS應(yīng)用由哪些部分組成?JMS客戶(hù)端 :用來(lái)發(fā)送和接收消息的Java語(yǔ)言程序。非JMS客戶(hù)端:這些客戶(hù)端是用消息系統(tǒng)的本地客戶(hù)端API編寫(xiě)的,而不是JMS。如果應(yīng)用先于JMS出來(lái)之前,那么它可能會(huì)既包括JM

11、S客戶(hù)端,也包括非JMS客戶(hù)端。 Messages(消息):每個(gè)應(yīng)用定義了用于在客戶(hù)端之間進(jìn)行通訊的消息。JMS Provider (JMS提供者):實(shí)現(xiàn)了JMS規(guī)范的消息系統(tǒng),該系統(tǒng)還提供必須的用于管理和控制全方位的功能。Administered Objects(被管理的對(duì)象):是預(yù)先配置的JMS對(duì)象,由系統(tǒng)管理員為使用JMS的客戶(hù)端創(chuàng)建。11.3如何實(shí)現(xiàn) JMS 客戶(hù)端程序的跨性?由于有很多 JMS消息系統(tǒng),它們的底層實(shí)現(xiàn)技術(shù)各不相同,比如 Sun MQ, IBMMQ,BEA MQ,Apache ActiveMQ,那么如何使得 JMS 客戶(hù)端針對(duì)這些消息系統(tǒng)編程時(shí)能夠隔離這些產(chǎn)品的變化而具

12、有跨特性呢?那就是通過(guò)定義被管理的對(duì)象來(lái)實(shí)現(xiàn)。被管理的對(duì)象是由管理員通過(guò)使用 JMS 系統(tǒng)提供者的管理工具創(chuàng)建和定制,然后被 JMS 客戶(hù)端使用??蛻?hù)端通過(guò)接口來(lái)調(diào)用這些被管理的對(duì)象,從而具備跨特性。主要有兩個(gè)被管理的對(duì)象:ConnectionFactory: 這是客戶(hù)端用來(lái)創(chuàng)建同 JMS 提供者之間的連接的對(duì)象。Destination :這個(gè)對(duì)象是客戶(hù)端用來(lái)指明消息被發(fā)送的目的地以及客戶(hù)端接收消息的來(lái)源。被管理的對(duì)象一般被管理員放在 JNDI 名字空間中,通常在客戶(hù)端應(yīng)用的文檔中說(shuō)明它所需要的被管理對(duì)象,以及應(yīng)以何種 JNDI 名字來(lái)提供這些被管理對(duì)象。下圖 JMS 管理的一般工作順序。1.

13、4有關(guān)兩種消息方式簡(jiǎn)介消息應(yīng)用能使用點(diǎn)對(duì)點(diǎn)(PTP)和發(fā)布訂閱(Pub/Sub)的消息方式,在一個(gè)應(yīng)用中也能混合使用兩種消息方式2Cnts A 和 B是消息生產(chǎn)者,以?xún)煞N不同的目的地向CntsC, D, 和E 發(fā)送消息:在cnts A, C, 和 D之間的消息是點(diǎn)對(duì)點(diǎn)模式,使用這種模式,客戶(hù)端發(fā)送消息到隊(duì)列目的地,從這個(gè)隊(duì)列里面只有一個(gè)消息接收者可以收到那個(gè)消息,其他同一目的地的接收者不會(huì)接收到消息。在cnts B, E, 和F之間的消息是發(fā)布訂閱模式。使用這種廣播模式,一個(gè)客戶(hù)端發(fā)送消息給目的地,任何數(shù)量的消費(fèi)訂閱者可以從這個(gè)目的地來(lái)接收它們。這兩種消息方式通常被稱(chēng)為消息域(messagin

14、gs)。JMS提供這兩個(gè)消息域,因?yàn)樗鼈兇韮煞N常用的消息模式。當(dāng)使用JMS API的時(shí)候,開(kāi)發(fā)者能使用接口和方法來(lái)支持這兩種消息模式。當(dāng)使用接,消息系統(tǒng)的行為可能會(huì)有所不同,因?yàn)?,這兩種消息域有不同的語(yǔ)義,稍后會(huì)詳細(xì)介紹兩種消息域的語(yǔ)義。以上兩個(gè)領(lǐng)域的消費(fèi)者可以選擇同步還是異步獲取消息。同步消費(fèi)者顯式調(diào)用方法來(lái)獲取消息,異步消費(fèi)者指定一個(gè)回叫方法來(lái)處理消息。JMS 基于一套通用的消息概念。每個(gè)JMS消息域(PTP 和Pub/Sub)也都定義了一套自己概念的接口。JMS 通用接口則提供了不依賴(lài)于PTP和Pub/Sub消息域的能力。3JMS CommonerfaPTP-specificerfaP

15、ub/Sub-specificerfaConnectionFactoryQueueConnectionFactoryTopicConnectionFactoryConnectionQueueConnectionTopicConnectionDestinationQueueTopicSesQueueSesTopicSesMessageProducerQueueSenderTopicPublisherConnectionFactory :被管理的對(duì)象,由客戶(hù)端使用,用來(lái)創(chuàng)建Connection:一個(gè)到JMS消息系統(tǒng)提供者的活動(dòng)連接。 Destination :一個(gè)被管理對(duì)象,封裝了消息目的地的標(biāo)識(shí)

16、。接。Ses- a single:一個(gè)用來(lái)發(fā)送和接收消息的單獨(dú)的線(xiàn)程上下文MessageProducer :一個(gè)由Ses MessageConsumer :一個(gè)由Ses對(duì)象。對(duì)象創(chuàng)建的,用來(lái)發(fā)送消息的到目的地的對(duì)象。對(duì)象創(chuàng)建的,用來(lái)接收發(fā)送到某個(gè)目的地的消息的這些對(duì)象之間的如下圖所示:1.5開(kāi)發(fā)一個(gè)基于 JMS 的消息客戶(hù)端應(yīng)用的編程步驟使用JNDI查找一個(gè)ConnectionFactory對(duì)象。使用JNDI查找一個(gè)或者多個(gè)Destination對(duì)象。使用ConnectionFactory創(chuàng)建一個(gè)JMS連接使用連接創(chuàng)建一個(gè)或者多個(gè)JMS Sess使用Sesand Destinations 創(chuàng)建

17、所需的MessageProducers 和MessageConsumers告知Connection 開(kāi)始傳送消息。1.6有關(guān)多線(xiàn)程方面4MessageConsumerQueueReceiverQueueBrowserTopicSubscriberJMS可能被要求所有它的對(duì)象都支持并發(fā)使用。由于支持并發(fā)通常會(huì)增加一些難度和復(fù)雜性,所以設(shè)計(jì)限定只有那些被多線(xiàn)程客戶(hù)端可自然而然就共享的對(duì)象提供滿(mǎn)足并發(fā)的需求,剩余對(duì)象被設(shè)計(jì)為一次只能有一個(gè)邏輯線(xiàn)程。下表列出了對(duì)JMS對(duì)并發(fā)的支持情況。5對(duì)象是否支持并發(fā)Destination是ConnectionFactory是Connection是Ses否Messa

18、geProducer否MessageConsumer否第2章JMS 消息模型2.1背景:企業(yè)級(jí)的消息產(chǎn)品將消息看做包括一個(gè)“頭”(header)和一”(body)的“輕量級(jí)”條目?!跋㈩^”包含一些用于消息路由和消息識(shí)別的字段?!跋Ⅲw”中包含了被發(fā)送的應(yīng)用數(shù)據(jù)。在這種通常的格式下,不同的消息產(chǎn)品對(duì)于消息的定義會(huì)有很大的不同。這些不同主要是“消息頭”的內(nèi)容和語(yǔ)義。一些產(chǎn)品使用自我描述的、規(guī)范編碼的消息數(shù)據(jù),而其他則以完全不透明的方式處理數(shù)據(jù)。一些產(chǎn)品提供一個(gè)消息的描述,這些描述用于識(shí)別和解釋消息的內(nèi)容,而其他的產(chǎn)品則不會(huì)。這就使得 JMS 把握這些消息模型的常見(jiàn)的尺度變得非常。2.2目標(biāo):JM

19、S消息模型目標(biāo)如下:提供一個(gè)單獨(dú),的消息API。提供一個(gè)用于創(chuàng)建消息能夠匹配已有的,非應(yīng)用所使用的格式。支持跨操作系統(tǒng)、機(jī)器結(jié)構(gòu)以及計(jì)算機(jī)語(yǔ)言的異構(gòu)應(yīng)用的開(kāi)發(fā)。支持包含Java對(duì)象的消息。支持包含可擴(kuò)展標(biāo)記語(yǔ)言(XML)頁(yè)面的消息。2.3JMS 消息JMS 消息包含以下組成部分:消息頭(Header) :所有的消息都支持一套相同的頭字段。頭字段包含了客戶(hù)端和提供者(provider)用來(lái)路由和識(shí)別消息的數(shù)據(jù)。消息屬性(Properties ):在標(biāo)準(zhǔn)頭字段之外提供一種內(nèi)建的設(shè)施用于給消息添加可選的頭字段應(yīng)用指定的屬性:提供一種給消息添加應(yīng)用指定的頭字段的機(jī)制。標(biāo)準(zhǔn)屬性 :JMS定義的一些標(biāo)準(zhǔn)屬

20、性,即一些有效的、可選的頭字段。Provider指定的屬性:在集成JMS客戶(hù)端和provider 內(nèi)在客戶(hù)端時(shí)可能需要使用Provider指定的屬性,JMS 為這些定義了命名約定。6消息體(Body):JMS定義了幾種類(lèi)型的消息體,這些消息體覆蓋目前常用的幾種消息樣式。2.4消息頭字段下面的各節(jié)描述了每個(gè) JMS“消息頭”,消息頭的完整信息將被傳遞給所有接收到消息的 JMS 客戶(hù)端。JMS 沒(méi)有定義傳遞給非 JMS 客戶(hù)端的消息頭字段。2.4.1JMSDestinationJMSDestination 消息頭字段包含了消息被發(fā)送到的目的地。當(dāng)消息被發(fā)出的時(shí)候,這個(gè)字段被忽略。在消息發(fā)送結(jié)束后,

21、消息持有了由發(fā)送方法指定的目的地對(duì)象。當(dāng)一個(gè)消息被接收的時(shí)候,它目的地對(duì)象的值必須與它發(fā)出時(shí)候賦予的值相等。2.4.2JMSDeliveryModeJMSDeliveryMode頭字段包含了消息發(fā)送時(shí)指定的傳送模式信息。在消息被發(fā)送的時(shí)候,這個(gè)字段被忽略,當(dāng)消息發(fā)送完成后,它持有了由發(fā)送方法所指定的傳送模式。2.4.3JMSMessageIDThe JMSMessageID 頭字段包含了一個(gè)唯一的標(biāo)識(shí)每一條由提供者發(fā)出消息的值 。在消息被發(fā)送的時(shí)候,JMSMessageID被忽略,當(dāng)send方法返回時(shí),這個(gè)字段就包含了一個(gè)由提供者賦予的值。JMSMessageID 是一個(gè) String 值,這

22、個(gè)值用做消息在歷史庫(kù)中唯一鍵值。唯一性的確切范圍由提供者定義,但它至少應(yīng)當(dāng)覆蓋提供者的一個(gè)特定安裝點(diǎn)上的所有消息。安裝點(diǎn)就是被一系列消息路由器連接的地方。所有的JMSMessageID值必須以前綴ID:開(kāi)頭。不必保證消息ID值在不同的提供者時(shí)也保持唯一。因?yàn)橄D會(huì)增加消息的大小,所以如果JMS提供者被提示不在應(yīng)用中使用消息ID時(shí),可能會(huì)優(yōu)化消息的開(kāi)銷(xiāo)。JMS產(chǎn)生者提出一個(gè)消息ID的提示。當(dāng)一個(gè)客戶(hù)端設(shè)置消息產(chǎn)生者消息ID,這就是說(shuō),它不依賴(lài)于它所產(chǎn)生消息的ID值。如果JMS提供者接受了這個(gè)提示,消息必須設(shè)置消息ID為null 。如果消息提供者忽略了這個(gè)提示,那么消息ID必須被設(shè)置為正常的唯

23、一值。2.4.4JMSTimestJMSTimest頭字段含有消息被交給提供者去發(fā)送的時(shí)間。這個(gè)時(shí)間不是消息實(shí)際7被傳送的時(shí)間。因?yàn)槭聞?wù)或其他客戶(hù)端對(duì)消息的排隊(duì)導(dǎo)致實(shí)際傳送消息可能會(huì)延遲。在消息被發(fā)出的時(shí)候 ,JMSTimest被忽略。當(dāng)發(fā)送方法返回的時(shí)候,這個(gè)字段包含了在發(fā)送方法被調(diào)用和返回時(shí)間段之中的一個(gè)時(shí)間值。這是一個(gè)正規(guī)Java毫秒時(shí)間格式的時(shí)間值。由于timests對(duì)創(chuàng)建消息和消息的大小會(huì)產(chǎn)生影響,如果應(yīng)用給消息提供者一個(gè)不使用timests的一個(gè)提示,那么消息提供者可以?xún)?yōu)化消息的開(kāi)銷(xiāo)。JMS提供者應(yīng)提供timests的功能。當(dāng)客戶(hù)端設(shè)置提供者timests時(shí),它所產(chǎn)生的消息不依賴(lài)于

24、timest。如果JMS提供者接受了這個(gè)提示,消息中的timest值被設(shè)置為0。如果消息提供者忽略了這個(gè)提示,那么timest必須設(shè)置為正規(guī)的值。2.4.5JMSCorrelationID客戶(hù)端能用JMSCorrelationID 頭字段將一個(gè)消息同另一個(gè)消息相聯(lián)接。一個(gè)典型的用法就是將一個(gè)響應(yīng)消息同它的請(qǐng)求消息相連接。JMSCorrelationID 能夠持有以下中的一種:提供者指定的消息ID.應(yīng)用指定的字符串。提供者本地的字節(jié)值。因?yàn)槊總€(gè)由JMS提供者發(fā)出的消息都被賦予一個(gè)消息ID值,這非常便于通過(guò)消息ID進(jìn)行消息之間的連接。所有的消息ID值必須以ID:作為前綴。在某些情況下,應(yīng)用(由幾個(gè)

25、客戶(hù)端組成)需要使用應(yīng)用指定的值連接消息。例如:一個(gè)應(yīng)用可以使用JMSCorrelationID去持有對(duì)一些外部信息的。應(yīng)用指定的值不必以ID:作為前綴。以“ID:”作為前綴被保留給JMS提供者產(chǎn)生的消息ID 。如果提供者支持本地概念上的correlation ID(相關(guān)聯(lián)ID),JMS客戶(hù)端可能需要賦予 JMSCorrelationID一個(gè)能夠匹配非JMS客戶(hù)端要求的值。byte 值就是用于這個(gè)目的。沒(méi)有本地correlation ID 值的JMS提供者不需要支持byte 值*。使用byte 導(dǎo)致應(yīng)用不具備可移植性。* 它們的setJMSCorrelationIDAsBytes() 和 ge

26、tJMSCorrelationIDAsBytes()方法將拋出異常lang.UnsupportedOperationException.2.4.6JMSReplyToJMSReplyTo頭字段包含一個(gè)由客戶(hù)端在發(fā)送消息的時(shí)候提供的目的地信息 。這個(gè)目的地就是回復(fù)這個(gè)消息的目的地。發(fā)出的消息帶有一個(gè)null JMSReplyTo 值可能表示一些事件或者它們只是一些發(fā)送者認(rèn)為別人會(huì)感的數(shù)據(jù)。帶有JMSReplyTo 值的消息通常期8望能有一個(gè)響應(yīng),這個(gè)響應(yīng)是可選的,它由客戶(hù)端決定。2.4.7JMSRedelivered如果客戶(hù)端接收的消息帶有JMSRedelivered指示符設(shè)置,那么可能(但不一

27、定),這個(gè)消息過(guò)去被發(fā)送了但是沒(méi)有被確認(rèn)。通常,如果消息被再次發(fā)送,提供者必須設(shè)置JMSRedelivered消息頭字段。如果這個(gè)字段被設(shè)置為true,這對(duì)于消費(fèi)它的應(yīng)用來(lái)說(shuō)就必須注意額外的重復(fù)處理,因?yàn)檫@個(gè)消息過(guò)去曾經(jīng)發(fā)送過(guò)。 這個(gè)頭字段在發(fā)送時(shí)沒(méi)有任何意義并且被發(fā)送方法設(shè)置為未賦值。2.4.8JMSTypeJMSType頭字段包含了由客戶(hù)端在發(fā)送消息時(shí)提供的消息類(lèi)型標(biāo)識(shí)。一些消息提供者使用由應(yīng)用發(fā)送的消息定義。type頭字段可以提供者庫(kù)中的消息定義。JMS消息沒(méi)有定義一個(gè)標(biāo)準(zhǔn)的消息定義庫(kù),也沒(méi)有定義這個(gè)庫(kù)中所包含的各種定義名策略。一些消息系統(tǒng)要求每個(gè)被創(chuàng)建的應(yīng)用消息都必須有一個(gè)消息類(lèi)型定義

28、,并且每個(gè)消息都指定它的類(lèi)型。為了能夠使JMS工作于這些消息系統(tǒng)提供者,無(wú)論應(yīng)用是否使用,JMS客戶(hù)端最好賦值JMSType ,這樣可以保證為需要該頭字段的提供者提供了正確的設(shè)置。為了保證移植性,JMS客戶(hù)端應(yīng)使用安裝時(shí)在提供者消息庫(kù)中定義的語(yǔ)義值作為JMSType的值。2.4.9 JMSExpiration在消息被發(fā)送的時(shí)候,它的過(guò)期時(shí)間是發(fā)送方法指定的time-to-live 值加上當(dāng)前的GMT值之和。在發(fā)送方法返回時(shí),這個(gè)消息的 JMSExpiration 頭字段就包含了這個(gè)值。當(dāng)消息被接收時(shí),它的 JMSExpiration 應(yīng)含有相同的值。如果 time-to-live 被設(shè)置為 0

29、,過(guò)期時(shí)間被設(shè)置為 0,則表明這個(gè)消息永不過(guò)期。當(dāng) GMT 晚于了一個(gè)未被發(fā)送的消息的過(guò)期時(shí)間時(shí),這個(gè)消息將被銷(xiāo)毀。JMS 沒(méi)有定義消息過(guò)期通知,客戶(hù)端不會(huì)接收到過(guò)期的消息,但是 JMS不保證那樣的事情不會(huì)發(fā)生。2.4.10JMSPriorityJMSPriority 頭字段包含了消息的優(yōu)先級(jí)。在消息被發(fā)送的時(shí)候,這個(gè)字段被忽略,當(dāng)消息發(fā)送完成后,它持有了發(fā)送方法指定的值。JMS定義了10級(jí)的優(yōu)先級(jí),0作為最低級(jí),9。除此之外,客戶(hù)端可以認(rèn)為0-4級(jí)是普通優(yōu)先級(jí),而5-9作為加速優(yōu)先級(jí)。JMS是不強(qiáng)迫提供者嚴(yán)格實(shí)現(xiàn)消息的優(yōu)先級(jí)順序,但是,最好實(shí)現(xiàn)加速消息先于普通消息。92.4.11對(duì)消息頭信息

30、如何被設(shè)置的總結(jié)2.4.12重載消息頭字段JMS允許管理者配置JMS使得它能夠重載客戶(hù)端指定的JMSDeliveryMode,JMSExpiration及JMSPriority字段的值。如果對(duì)消息頭字段進(jìn)行重載,消息頭字必須反映出管理設(shè)定的值。JMS沒(méi)有定義管理者如何重載這些頭字這個(gè)管理選項(xiàng)。JMS提供者不一定支持2.5 消息屬性除了頭字段定義的信息以外,Message 接口包含了內(nèi)置的設(shè)置來(lái)支持屬性值。因而,這就提供了一種為消息增加可選頭信息的機(jī)制。通過(guò)消息選擇器,屬性可以使客戶(hù)端讓JMS提供者按照應(yīng)用指定的規(guī)則選擇消息。2.5.1屬性名屬性名稱(chēng)必須遵循消息選擇器標(biāo)識(shí)符的規(guī)則。2.5.2屬性

31、值屬性值可以是, byte, short, long, float, double, 以及String(Java語(yǔ)言基本類(lèi)型和String)10Header FieldsSet ByJMSDestinationSend MethodJMSDeliveryModeSend MethodJMSExpirationSend MethodJMSPrioritySend MethodJMSMessageIDSend MethodJMSTimestSend MethodJMSCorrelationIDCntJMSReplyToCntJMSTypeCntJMSRedeliveredProvider2.5.3

32、使用屬性屬性值在消息發(fā)送前指定,當(dāng)一個(gè)客戶(hù)接收到一個(gè)消息的時(shí)候,它的屬性是“只讀”模式的。如果一個(gè)客戶(hù)端此時(shí)試圖設(shè)置屬性值,就會(huì)拋出一個(gè)MessageNotWriteableException 的異常。屬性值可以一個(gè)消息體的值,也可以不必。盡管JMS沒(méi)有定義什么應(yīng)該成為屬性,什么不該成為屬性的策略,但是應(yīng)用開(kāi)發(fā)者應(yīng)當(dāng)注意JMS提供者可能處理消息體數(shù)據(jù)的效率要高于處理消息屬性數(shù)據(jù)。為了獲得最佳性能,應(yīng)用應(yīng)當(dāng)只在它們確實(shí)需要自定義一個(gè)消息頭的時(shí)候才使用消息屬性,而自定義消息頭的主要原因就是為了支持自定義消息選擇。2.5.4屬性值的轉(zhuǎn)換屬性支持以下的轉(zhuǎn)換表。標(biāo)記的情況必須被支持。未標(biāo)記的情況必須拋出

33、JMS MessageFormatException異常。在字符串向數(shù)字轉(zhuǎn)換的時(shí)候,如果numeric 的valueOf()方法不能接受一個(gè)字符串的值作為一個(gè)正確的表式,必須拋出java.lang.NumberFormatException異常。試圖一個(gè)null值作Java基本類(lèi)型的值時(shí),必須按照調(diào)用基本類(lèi)型相應(yīng)的 valueOf(String)轉(zhuǎn)換方法來(lái)處理null值。Row類(lèi)型的值集合必須按照column類(lèi)型對(duì)待才能讀取。2.5.5屬性值作為對(duì)象除了有關(guān)屬性的指定類(lèi)型的set/get方法外,JMS提供了setObjectProperty/getObjectProperty 方法。這些方法使

34、用對(duì)象化的基本類(lèi)型值支持相同系列的屬性類(lèi)型。它們的目的是允許在運(yùn)行時(shí)確定屬性類(lèi)型,而不是在編譯時(shí)。他們支持相11byteshortlongfloatdoubleStringXXbyteXXXXXshortXXXXXXXlongXXfloatXXXdoubleXXStringXXXXXXXX同的屬性值轉(zhuǎn)換。setObjectProperty方法接受, Byte, Short,eger, Long, Float,Double 和 String類(lèi)型值。試圖使用其他類(lèi)則必須拋出JMS異常MessageFormatException。getObjectProperty 方法只返回null, Byte,

35、Short,eger, Long, Float, Double 和String。如果指定的屬性名不存在,則返回Null值。2.5.6 屬性迭代沒(méi)有定義屬性值的順序,要迭代消息的屬性值,使用 getPropertyNames 去獲取屬性名稱(chēng)的枚舉,然后使用不同屬性的 get 方法去取得屬性值。getPropertyNames 方法不返回 JMS標(biāo)準(zhǔn)頭字段的名字。2.5.7 清空消息屬性值消息屬性可通過(guò)clearProperties方法刪除,這使消息只剩下空的屬性集合。新的屬性條目可以被創(chuàng)建和。清空消息屬性條目不會(huì)清空消息體的值。不支持一次只刪除一條屬性的方法。2.5.8 不存在的屬性如果用一個(gè)名

36、字獲得一個(gè)還沒(méi)有該名字屬性的屬性值時(shí),那么它的處理看起來(lái)和該屬性已存在了一樣,只不過(guò)返回一個(gè)null值。2.5.9 JMS 定義的屬性JMS為JMS定義的屬性保留了JMSX屬性名前綴。的JMS定義的屬性見(jiàn)下表。新的定義的屬性可以被增加到JMS最近的版本中。除非另有通知,這些支持是可選的。ConnectionMetaData.getJMSXPropertyNames() 返回了所有連接所支持的屬性名。無(wú)論JMSX屬性是否被連接所支持,這些屬性都可以被消息選擇器。 如果JMSX屬性沒(méi)有出現(xiàn)在消息中,它們被按照所有未存在的屬性一樣對(duì)待。在特定消息中存在的JMS定義的屬性是由JMS提供者根據(jù)自身如何控

37、制這個(gè)屬性的用途來(lái)進(jìn)行設(shè)置。它可以選擇讓一些消息中包含這些屬性,而在別的消息中去除這些屬性,這些取決于管理或者其他規(guī)則12NamTypeSet ByUseJMSXUserIDStringProvider on用于標(biāo)識(shí)發(fā)送消息的用戶(hù)。消息的生產(chǎn)者和消費(fèi)者都能得到由提供者在發(fā)送消息時(shí)設(shè)置的JMSX屬性。而提供者在消息接收時(shí)設(shè)置的JMSX屬性只能被消費(fèi)者得到。如果客戶(hù)端想對(duì)消息進(jìn)行分組,那么JMSXGrou和 JMSXGroupSeq 是標(biāo)準(zhǔn)的屬性。所有的提供者必須支持這兩個(gè)屬性。這些JMSX屬性名稱(chēng)的大小寫(xiě)必須按照上表的定義。除非特別說(shuō)明,JMSX屬性的值和語(yǔ)義是未定義的。13SendJMSXAp

38、StringProvider onSend用于識(shí)別發(fā)送消息的應(yīng)用。JMSXDeliveryCountProvider onReceive這消息發(fā)送嘗試的次數(shù)。第一次是1,然后是2.JMSXGrouStringCnt用來(lái)表示消息是哪個(gè)組的一部分。JMSXGroupSeqCnt表示消息在組內(nèi)的順序號(hào)第一個(gè)消息是1,第二個(gè)是2,JMSXProducerTXIDStringProvider on Send事務(wù)標(biāo)識(shí)符,用來(lái)表示消息是在哪個(gè)事務(wù)中產(chǎn)生的。JMSXConsumerTXIDStringProvider onReceive消息標(biāo)識(shí)符,用來(lái)說(shuō)明消息是在哪個(gè)事務(wù)中被消費(fèi)的。JMSXRcvTimest

39、longProvider on Receive消息被發(fā)送到消費(fèi)者時(shí)的時(shí)間。JMSXSeProvider設(shè)想有一個(gè)消息倉(cāng)庫(kù)保存每個(gè)被發(fā)給消費(fèi)者消息的拷貝,并且這些拷貝從消息開(kāi)始發(fā)出之時(shí)就存在。每個(gè)拷貝的狀態(tài)是如下:1(waiting), 2(ready), 3(expired) or 4(retained).因?yàn)楫a(chǎn)生者和消費(fèi)者都不關(guān)心狀態(tài),所以這個(gè)屬性只是用于在倉(cāng)庫(kù)中查詢(xún)消息,并且JMS沒(méi)有為其提供任何的 API。2.5.10 提供者指定的屬性JMS保留了JMS_作為提供者指定的屬性名稱(chēng)前綴。每個(gè)提供者定義它們自己的。這就是JMS提供者用來(lái)指定它能給JMS客戶(hù)端帶來(lái)的特定的消息服務(wù)的措施。提供者

40、指定屬性目的在于支持使用“提供者本地客戶(hù)端”所需要的特性。這些屬性不應(yīng)被用于JMS或者JMS消息。2.6 Message 確認(rèn)所有的JMS消息支持acknowledge方法,這個(gè)方法用于客戶(hù)端已經(jīng)指定消費(fèi)者的消息被顯示地確認(rèn)。如果客戶(hù)端使用自動(dòng)確認(rèn),調(diào)用,acknowledge方法將被忽略。2.7消息接口Message 是所有消息的根接口。它定義了JMS 消息的頭字段,屬性設(shè)施和 acknowledge 方法。2.8Message 選擇很多消息應(yīng)用需要過(guò)濾消息或?qū)λ鼈儺a(chǎn)生的消息進(jìn)行分類(lèi)。在消息只發(fā)給一個(gè)接收者的時(shí)候,將消息過(guò)濾規(guī)則加在消息上能夠合理提高效率,使得接收的客戶(hù)端不理會(huì)它不感的消息。

41、當(dāng)消息廣播給很多客戶(hù)端時(shí),將效率規(guī)律規(guī)則加在消息頭上更加有用,以便JMS提供者可以知道這個(gè)規(guī)則。這使得提供者可以處理這些大量的過(guò)濾和路由工作,否則,這些工作就要由應(yīng)用程序自己去做。JMS提供了這種機(jī)制讓客戶(hù)端將“消息選擇”給它們的JMS提供者。這簡(jiǎn)化了客戶(hù)端的工作,并且讓JMS提供者減少了因發(fā)送給客戶(hù)端不需要的消息而浪費(fèi)的時(shí)間和帶寬??蛻?hù)端通過(guò)使用消息屬性來(lái)制定應(yīng)用指定的消息選擇規(guī)則??蛻?hù)端通過(guò)消息選擇器表達(dá)式來(lái)指定消息的選擇規(guī)則。2.8.1 Message 選擇器消息選擇器可由客戶(hù)端通過(guò)消息頭指定它所感的消息。只有消息頭和屬性能夠匹配的消息才能傳送給客戶(hù)端。根據(jù)消息消費(fèi)者的不同,“不傳送”的

42、語(yǔ)義會(huì)有一點(diǎn)不同。參見(jiàn)“QueueReceiver”和“TopicSubscriber”來(lái)獲取詳細(xì)信息。消息選擇器不涉及消息體14的值。用消息頭字段和屬性值替換消息選擇器中的標(biāo)識(shí)符后,如果求值為true的,表示消息同消息選擇器相匹配。2.8.2 消息選擇語(yǔ)法消息選擇器是一個(gè)字符串,這個(gè)字符串的語(yǔ)法是基于條件表達(dá)式語(yǔ)法SQL92*的一個(gè)子集。 如果消息選擇器的值是一個(gè)空字符串,這個(gè)值被按照null處理,并且說(shuō)明沒(méi)有為消息消費(fèi)者設(shè)定消息選擇器。消息選擇器的取值順序是從左到右,括號(hào)能夠改變這個(gè)順序。在這里用大寫(xiě)來(lái)表示預(yù)先定義的選擇器的文字和操作符。但是,他們實(shí)際上是大小寫(xiě)無(wú)關(guān)的。一個(gè)選擇器包括如下:

43、Literals:文字字符串文字由一個(gè)單引號(hào)括起來(lái)表示,字符串中的單引號(hào)用兩個(gè)單引號(hào)表示。例如:literal and literals.如同Java String文字一樣,都使用Unicode字符編碼。精確的數(shù)字文字是不帶有小數(shù)點(diǎn)的數(shù)字值,例如57, -957, +62;支持Java long的取值范圍。近似的數(shù)字文本是一個(gè)使用科學(xué)技術(shù)法表示的值,例如: 7E3 and -57.9E2,或者帶有小數(shù)的數(shù)字,例如7., -95.7, and +6.2;支持Java double的取值范圍。近似文字使用Java浮點(diǎn)數(shù)文字語(yǔ)法。文字是TRUE 和 FALSE.Identifiers:標(biāo)識(shí)符標(biāo)識(shí)符是

44、沒(méi)有長(zhǎng)度限制的字符串,必須以Java標(biāo)識(shí)符字符開(kāi)頭。所有允許的字符必須是Java標(biāo)識(shí)符允許的字符。標(biāo)識(shí)符的開(kāi)始字符是任何Character.isJavaIdentifierStart返回為true的值。這包括_ 和$。表示符的組成字符是任何Character.isJavaIdentifiart返回為true的字符。標(biāo)識(shí)符不能是NULL, TRUE, 或 FALSE.標(biāo)識(shí)符不能是NOT, AND, OR, BET標(biāo)識(shí)符可以是頭字段或者屬性的N, LIKE, IN, IS, 或者ESC.,消息選擇器中的屬性值類(lèi)型應(yīng)該與設(shè)置屬性時(shí)使用的類(lèi)型一致。如果消息中不存在的屬性被了,它的值是NULL。在消息選

45、擇器中求NULL值的語(yǔ)義在后面的“Null Values.”中詳細(xì)描述。屬性get方法中的轉(zhuǎn)換不適用于消息選擇器表達(dá)式,例如:把一個(gè)屬性設(shè)置為一個(gè)字符串值,如下:myMe ss a g e . s e t S t r i ngP r op e r t y ( Numb e rOfOr d e r s , 2 ) ;15下面選擇器表達(dá)式的取值為f a l s e ,因?yàn)樽址荒鼙挥糜跀?shù)學(xué)表達(dá)式。 Numb e rOfOr d e r s1 標(biāo)識(shí)符是大小寫(xiě)敏感的。的消息頭字段僅限于: JMSDeliveryMode,JMSPriority, JMSMessageID,可, JMSCorrelat

46、ionID, andJMSType.而且 JMSType 值可以是null,如果JMSTimestJMSType 值是null,那么被當(dāng)作NULL處理。任何以JMSX開(kāi)始的名字都是JMS定義屬性名。任何以JMS_開(kāi)頭的名字都是提供者指定的屬性名。任何不是以JMS開(kāi)頭的名字都是應(yīng)用指定的屬性名??崭裢琂ava中定義的一樣:空格,水平tab,制表符和行結(jié)束符。Express表達(dá)式選擇器是條件表達(dá)式,選擇器表達(dá)式求值為true表示匹配,為false 或者unknown表示不匹配。數(shù)學(xué)表達(dá)式由數(shù)學(xué)操作符,帶有數(shù)字值的標(biāo)識(shí)符和數(shù)字文本組成。條件表達(dá)式由比較操作符,邏輯操作符,帶有值的標(biāo)識(shí)符以及文本組成。

47、支持用標(biāo)準(zhǔn)的括號(hào)()來(lái)改變求值順序。邏輯操作符的優(yōu)先順序?yàn)椋篘OT, AND, OR比較操作符: =, , =, , =, (不等于)只有相同類(lèi)型的值可以進(jìn)行比較,一個(gè)例外就是,比較確且的數(shù)字和近似數(shù)字是 正確的(需要的類(lèi)型轉(zhuǎn)換是由JAVA數(shù)字說(shuō)明(numeric promotion)規(guī)則定義的)。如果試圖比較類(lèi)型不一樣的值,那么操作的結(jié)果就是false。如果兩個(gè)類(lèi)型中任何一個(gè)值是NULL,那么比較的結(jié)果就是unknown.String 和才是相等的。的比較僅限于= 和 只有兩個(gè)字符串包含相同序列的字符時(shí)數(shù)學(xué)操作符的優(yōu)先順序是:+, - (一元操作符)*, / (乘和除)+, - (加和減)數(shù)

48、學(xué)操作符必須使用Java numeric promotion.arithmetic-expr1 NOT BETN arithmetic-expr2 AND arithmetic-expr3(比較操作符)age BETN 15 AND 19”等價(jià)于 “age = 15 AND age = 19”16age NOT BETN 15 AND 19” 等價(jià)于 “age 19”identifier NOT IN (string-literal1, string-literal2,.) (比較操作符,這里 identifier 是一個(gè)String or NULL 值 )表達(dá)式“Country IN ( U

49、K, US, France)”對(duì)于Country值為UK返回true,Peru返回false,相當(dāng)于表達(dá)式 ”(Country = UK) OR (Country = US) OR (Country = France)”表達(dá)式 “Country NOT IN ( UK, US, France)” 對(duì)于Country值為UK返回false ,而Peru則返回true,它等價(jià)于表達(dá)式 “NOT (Country = UK) OR (Country= US) OR (Country = France)”如果IN 或者NOT IN 操作的identifier是NULL,表達(dá)式返回值將是unknown.

50、identifier NOT LIKE pattern-value ESCesc-character (比較操作符,這里identifier有一個(gè)String值; pattern-value is是一個(gè)字符串文本,在這個(gè)文本中_ 代表任何單個(gè)字符; % 代表任何字符串,包括空串和所以其他串,可選的esc-character是一個(gè)單字符(single-characte)的string文本,它的字符用于規(guī)避pattern-value 中_ 和% 的含義)?!皃hone LIKE 12%3” 當(dāng)phone是123或12993的時(shí)候返回true,當(dāng)phone是1234的時(shí)候返回false?!皐ord

51、LIKE l_se”當(dāng)work是lose返回true, 當(dāng)loose 時(shí)返回 false?!皍nderscored LIKE _% ESC回false.”當(dāng)underscored值為_(kāi)foo返回true,值為bar返“phone NOT LIKE 12%3”當(dāng)phone值為123和 12993 返回false,當(dāng)phone值為1234返回true。如果LIKE 或 NOT LIKE中的標(biāo)識(shí)符是NULL值,那么操作結(jié)果為unkonwn。identifier IS NULL (比較操作符,用來(lái)測(cè)試空的頭字或者丟失的屬性值)“prop_name IS NULL”identifier IS NOT N

52、ULL (比較操作符,用來(lái)測(cè)試非空的頭字存在或者數(shù)值的存在。)“prop_name IS NOT NULL”當(dāng)選擇器出現(xiàn)的時(shí)候,JMS提供者不必驗(yàn)證消息選擇器的語(yǔ)法正確性。一個(gè)提供錯(cuò)誤語(yǔ)法選擇器的方法將導(dǎo)致一個(gè)JMS InvalidSelectorException異常。JMS提供者也可以在選擇器出現(xiàn)時(shí),有選擇性地提供一些語(yǔ)義檢查。不是所有的語(yǔ)法檢查都可在消息選擇器出現(xiàn)時(shí)能夠進(jìn)行,因?yàn)閷傩灶?lèi)型是未知的。下面的語(yǔ)法選擇器選擇了消息類(lèi)型為car且color為blue17且weight大于2500 lbs的消息: JMSTyp e= ca rAND c o l o r= b l u e AND we

53、 i gh t2500 2.8.3 Null Values 空值如上所述,頭字段和屬性值可以為NULL。 包含NULL值的選擇器求值遵循SQL92NULL語(yǔ)義的定義?,F(xiàn)在簡(jiǎn)單描述這些語(yǔ)義。將NULL值看作unknown。帶有unknown值的比較或者數(shù)學(xué)操作通常得到unknown結(jié)果。IS NULL 及unknown的頭或者屬性值轉(zhuǎn)化為相應(yīng)的TRUE 和FALSE值。義的“三值”邏輯:IS NOT NULL 操作符將操作符使用按照下表所定操作符的定義OR 操作符定義NOT 操作符定義2.8.4 特別說(shuō)明.當(dāng)JMSDeliveryMode被用在消息選擇器中時(shí),它被按照有PERSISTENTNON

54、_PERSISTENT值處理。及18NOTTFFTUUORTFUTTTTFTFUUTUUANDTFUTTFUFUUFU日期(Date)和時(shí)間(Time)值使用標(biāo)準(zhǔn)的long 型Java毫秒值。當(dāng)一個(gè)日期或者時(shí)間文本被包含在一個(gè)消息表達(dá)式中時(shí),它應(yīng)當(dāng)是一個(gè)毫秒的整數(shù)文本。產(chǎn)生毫秒值的標(biāo)準(zhǔn)的方式是使用java.util.Calendar。盡管支持固定的小數(shù)比較或者數(shù)學(xué)計(jì)算,但JMS 消息選擇器并不支持,這也是僅支持那些沒(méi)有小數(shù)的精確的數(shù)字文本的原因(并且數(shù)字與小數(shù)相加是表示近似數(shù)的另法)。SQL注釋被支持。2.9被發(fā)送的消息在消息被發(fā)送后,客戶(hù)端可以保留并且更改這個(gè)消息而不影響已被發(fā)出的消息。相同

55、的消息對(duì)象可以被多次發(fā)送。在執(zhí)行sending方法期間,消息不能被客戶(hù)端更改,如果它被更改了,那么發(fā)送結(jié)果就是未定義。2.10 改變已接收的消息的值當(dāng)消息被接收到時(shí),它的頭字段的值能被改變。但是它的屬性和它的body內(nèi)容是只讀的。正如在本章中提到的,只讀限制的原因是它給JMS providers在如何實(shí)現(xiàn)接收到消息的管理方面的。比如,它們返回了一個(gè)消息對(duì)象,這個(gè)消息對(duì)象了的消息隊(duì)列中的屬性條目和Body值,而不是被強(qiáng)迫實(shí)現(xiàn)一個(gè)拷貝。在調(diào)用clearBody 或clearProperties方法之后使得body或者屬性可寫(xiě),從而消費(fèi)者能夠更改接收到的消息。如果消費(fèi)者更改了接收的消息,并且消息然后

56、被再次傳送,那么被再次傳送的消息必須是原始的,未被改變的消息(作為重新傳送的結(jié)果,除了被JMS provider 更改的頭和屬性之外,例如JMSRedelivered 頭和MSXDeliveryCount屬性,其他屬性和頭信息都不能被更改)。2.11 JMS 消息體JMS提供五種格式的消息體。每種格式都通過(guò)一個(gè)消息接口定義。StreamMessage 消息體包含了一個(gè)Java primitive 流,這個(gè)流被順序地填充和。MapMessage 消息體包含了一系列的名字-值對(duì)。名字是Strings,而值則是Java primitive類(lèi)型。消息體中的條目可以被enumerator按照順序有定義。

57、,也可以。條目的順序沒(méi)19TextMessage 消息體包含了一個(gè)java.lang.String. 包含這種這種消息類(lèi)型是考慮到String消息將被廣泛使用的前提。另外一個(gè)原因就是XML將可能變成一種用來(lái)表示JMS消息內(nèi)容的主流機(jī)制。ObjectMessage 消息包含了一個(gè)可序列化的Java對(duì)象.如果需要Java對(duì)象集合(collection),可以是JDK 1.2提供的集合類(lèi)型中的任何一種。BytesMessage 消息包含了一個(gè)不間斷的字節(jié)流。這個(gè)消息類(lèi)型是用來(lái)以文字方式編碼一個(gè)消息體以匹配存在的消息格式。在很多種情況下,它可能被用于以下用途:自定義的消息類(lèi)型,盡管JMS允許使用帶有字

58、節(jié)的消息屬性,但它們通常不能被使用,因?yàn)榘膶傩钥梢杂绊懜袷健?.11.1 清空消息體clearBody方法重置消息體為empty初始消息值,如同這個(gè)消息類(lèi)型被Sescreate方法創(chuàng)建時(shí)一樣。清空消息體不會(huì)清空它的屬性條目。提供的2.11.2“只讀消息體”當(dāng)消息被接收到的時(shí)候,消息體是只讀的。如果試圖改變消息體。MessageNotWriteableException將被拋出。如果它的消息體被清空,那么消息同它被創(chuàng)建時(shí)是一樣的。2.11.3 由 StreamMessage 和MapMessage 提供的轉(zhuǎn)換功能StreamMessage和MapMessage都支持相同的primitive數(shù)

59、據(jù)類(lèi)型。類(lèi)型可通過(guò)使用每種類(lèi)型的方法顯式地讀寫(xiě)。例如,調(diào)用MapMessage.set(“foo”, 6)方法等價(jià)于MapMessage.setObject(“foo”, neweger(6)。兩種方法都被提供是因?yàn)轱@示格式便于靜態(tài)編程,并且當(dāng)類(lèi)型在編譯時(shí)不知道的時(shí)候就可以使用對(duì)象格式。StreamMessage和 MapMessage都支持下面的轉(zhuǎn)換表。打標(biāo)記的情況必須被支持。未打標(biāo)記的情況必須拋出JMS MessageFormatException。如果數(shù)字的valueOf() 方法不能接受字符串的值作正確的表達(dá)式,那么String到 numeric 的轉(zhuǎn)換必須拋出java.lang.Nu

60、mberFormatException .20byteshortcharlongfloatdoubleStringbyteXXbyteXXXXX.試圖讀一個(gè)空值作為Java主類(lèi)型必須被按照調(diào)用主類(lèi)型相應(yīng)的帶有null值的valueOf(String)轉(zhuǎn)換方法來(lái)對(duì)待。因?yàn)閏har不支持String轉(zhuǎn)換,所以試圖一個(gè)null值作為一個(gè)char必須拋出NullPoerException異常。通過(guò)字段名獲得MapMessage的字段已經(jīng)存在,其值為null來(lái)對(duì)待。,而這個(gè)字還沒(méi)有被設(shè)置,這種情況按照字如果StreamMessage 或BytesMessage 的方法拋出MessageFormatExc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論