版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、目錄第 1 章1.11.2JMS基本概念1JMS(JAVA MESSAGE SERVICE)?1JMS中的消息(MESSAGING)?11.3 如何實現(xiàn)JMS客戶端程序的跨性?2有關(guān)兩種消息方式簡介2開發(fā)一個基于JMS的消息客戶端應(yīng)用的編程步驟41.6 有關(guān)多線程方面. 4第 2 章 JMS 消息模型62.1 背景:62.2 目標(biāo):6JMS 消息6消息頭字段7JMSDestination7JMSDeliveryMode7JMSMessageID72.4.4 JMSTimest. 7JMSCorrelationID8JMSReplyTo8JMSRedelivered9JMSType9JMSExp
2、iration9JMSPriority9對消息頭信息如何被設(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屬性值作為對象11屬性迭代12清空消息屬性值12不存在的屬性12JMS定義的屬性12提供者指定的屬性14MESSAGE 確認14消息接口14MESSAGE 選擇14Message 選擇器14消息選擇語法15Null Values 空值18特別說明182.9被發(fā)送的消息19I改變已接收的消息的值19JMS消息體19清空消息體20“只讀消息體”20由StreamMessa
3、ge和MapMessage提供的轉(zhuǎn)換功能20第 3 章 JMS通用設(shè)施22ADMINISTERED OBJECTS被管理的對象22Destination目的地22ConnectionFactory連接工廠。23CONNECTION 連接23Authentication認證23Cnt Identifier客戶端標(biāo)識23Connection Setup連接的建立243.2.4 Pausing Delivery ofing Messages 停止傳送即將到來的消息243.2.5 Closing a Connection 關(guān)閉連接253.2.6 Sess 會話263.2.7 ConnectionMet
4、aData263.2.8 ExceptionListener異常器263.3 SES會話263.3.1 Closing a Ses關(guān)閉會話27MessageProducer 和 MessageConsumer 的創(chuàng)建28Creating Temporary Destinations 創(chuàng)建臨時目的地28Creating Destination Objects創(chuàng)建目的地對象。28Optimized Message ImplemenConventions for Using a Sesions優(yōu)化消息的實現(xiàn)。28使用Ses的常規(guī)283.3.7 Tranions 事務(wù)293.3.8 Distribut
5、ed Tranions 分布事務(wù)303.3.9 Multiple Sess 多會話30Message Order 消息順序30Message Acknowledgment 消息確認31Duplicate Delivery of Messages 重復(fù)的消息傳送32Duplicate Production of Messages 重復(fù)的消息生產(chǎn)323.3.14 Serial Execution of Cnt Code 順序執(zhí)行客戶端代碼323.3.15 Concurrent Message Delivery 并發(fā)消息傳送33MESSAGECONSUMER 消息消費者33Synchronous D
6、elivery 同步傳送33Asynchronous Delivery 異步傳送33MESSAGEPRODUCER 消息生產(chǎn)者34MESSAGE DELIVERY MODE 消息傳送模式34MESSAGE TIME-TO-LIVE 消息存活時間35EXCEPTIONS 異常35RELIABILITY 可靠性35第 4 章 JMS點對點傳輸模式37OVERVIEW概述37QUEUE MANAGEMENT(隊列管理)37IIQUEUE(隊列)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 安裝注意事項466.2 JMS 服務(wù)管理并創(chuàng)建各種目的地對象466.2.1 創(chuàng)建JMS服務(wù)管理. 466.2.2 創(chuàng)建目的地486.3 配置開發(fā)所需環(huán)境486.3.1 建立基于JNDI的管理對象環(huán)境486.3.2 在LDAP中目的地和連接工廠51第 7 章 基于發(fā)布/訂閱模式的應(yīng)用范
9、例537.1 背景537.2 實現(xiàn)53III第1章JMS 基本概念1.1JMS(Java Message Service)?JMS 為 Java 程序提供了一種創(chuàng)建、發(fā)送、接收和法。企業(yè)消息系統(tǒng)中消息的通用方企業(yè)消息產(chǎn)品(有時也被稱為面向消息的中間件MOM-MessageOriented Middleware),正成為一種用來整合公司操作的重要組件。它們使得分離的業(yè)務(wù)組件變成可靠而又靈活性的系統(tǒng)。Java語言編寫的客戶端以及中間層服務(wù)必須能夠這些系統(tǒng),JMS 為java語言這些消息系統(tǒng)提供了一種通用的方法。JMS是一系列的接口及相關(guān)語義的集合,通過這些接口和語義定義了JMS客戶端如何消息系統(tǒng)。
10、去1.2JMS 中的消息(Messaging)?消息這個術(shù)語在計算機系統(tǒng)中含義非常廣泛,它被不同的操作系統(tǒng)概念,它被郵件和傳真。而在這里,它指的是用于企業(yè)應(yīng)用間的異步通訊。這里所說的“消息”是指被企業(yè)應(yīng)用而不是人所消費的異步的請求、以及事件。消息中包含了重要的用來系統(tǒng)間進行協(xié)作的信息。消息中包含了精確的數(shù)據(jù)格式以描述特定的業(yè)務(wù)活動,通過應(yīng)用系統(tǒng)之間的消息交互,使得企業(yè)業(yè)務(wù)過程能夠保持一致。JMS應(yīng)用由哪些部分組成?JMS客戶端 :用來發(fā)送和接收消息的Java語言程序。非JMS客戶端:這些客戶端是用消息系統(tǒng)的本地客戶端API編寫的,而不是JMS。如果應(yīng)用先于JMS出來之前,那么它可能會既包括JM
11、S客戶端,也包括非JMS客戶端。 Messages(消息):每個應(yīng)用定義了用于在客戶端之間進行通訊的消息。JMS Provider (JMS提供者):實現(xiàn)了JMS規(guī)范的消息系統(tǒng),該系統(tǒng)還提供必須的用于管理和控制全方位的功能。Administered Objects(被管理的對象):是預(yù)先配置的JMS對象,由系統(tǒng)管理員為使用JMS的客戶端創(chuàng)建。11.3如何實現(xiàn) JMS 客戶端程序的跨性?由于有很多 JMS消息系統(tǒng),它們的底層實現(xiàn)技術(shù)各不相同,比如 Sun MQ, IBMMQ,BEA MQ,Apache ActiveMQ,那么如何使得 JMS 客戶端針對這些消息系統(tǒng)編程時能夠隔離這些產(chǎn)品的變化而具
12、有跨特性呢?那就是通過定義被管理的對象來實現(xiàn)。被管理的對象是由管理員通過使用 JMS 系統(tǒng)提供者的管理工具創(chuàng)建和定制,然后被 JMS 客戶端使用??蛻舳送ㄟ^接口來調(diào)用這些被管理的對象,從而具備跨特性。主要有兩個被管理的對象:ConnectionFactory: 這是客戶端用來創(chuàng)建同 JMS 提供者之間的連接的對象。Destination :這個對象是客戶端用來指明消息被發(fā)送的目的地以及客戶端接收消息的來源。被管理的對象一般被管理員放在 JNDI 名字空間中,通常在客戶端應(yīng)用的文檔中說明它所需要的被管理對象,以及應(yīng)以何種 JNDI 名字來提供這些被管理對象。下圖 JMS 管理的一般工作順序。1.
13、4有關(guān)兩種消息方式簡介消息應(yīng)用能使用點對點(PTP)和發(fā)布訂閱(Pub/Sub)的消息方式,在一個應(yīng)用中也能混合使用兩種消息方式2Cnts A 和 B是消息生產(chǎn)者,以兩種不同的目的地向CntsC, D, 和E 發(fā)送消息:在cnts A, C, 和 D之間的消息是點對點模式,使用這種模式,客戶端發(fā)送消息到隊列目的地,從這個隊列里面只有一個消息接收者可以收到那個消息,其他同一目的地的接收者不會接收到消息。在cnts B, E, 和F之間的消息是發(fā)布訂閱模式。使用這種廣播模式,一個客戶端發(fā)送消息給目的地,任何數(shù)量的消費訂閱者可以從這個目的地來接收它們。這兩種消息方式通常被稱為消息域(messagin
14、gs)。JMS提供這兩個消息域,因為它們代表兩種常用的消息模式。當(dāng)使用JMS API的時候,開發(fā)者能使用接口和方法來支持這兩種消息模式。當(dāng)使用接,消息系統(tǒng)的行為可能會有所不同,因為,這兩種消息域有不同的語義,稍后會詳細介紹兩種消息域的語義。以上兩個領(lǐng)域的消費者可以選擇同步還是異步獲取消息。同步消費者顯式調(diào)用方法來獲取消息,異步消費者指定一個回叫方法來處理消息。JMS 基于一套通用的消息概念。每個JMS消息域(PTP 和Pub/Sub)也都定義了一套自己概念的接口。JMS 通用接口則提供了不依賴于PTP和Pub/Sub消息域的能力。3JMS CommonerfaPTP-specificerfaP
15、ub/Sub-specificerfaConnectionFactoryQueueConnectionFactoryTopicConnectionFactoryConnectionQueueConnectionTopicConnectionDestinationQueueTopicSesQueueSesTopicSesMessageProducerQueueSenderTopicPublisherConnectionFactory :被管理的對象,由客戶端使用,用來創(chuàng)建Connection:一個到JMS消息系統(tǒng)提供者的活動連接。 Destination :一個被管理對象,封裝了消息目的地的標(biāo)識
16、。接。Ses- a single:一個用來發(fā)送和接收消息的單獨的線程上下文MessageProducer :一個由Ses MessageConsumer :一個由Ses對象。對象創(chuàng)建的,用來發(fā)送消息的到目的地的對象。對象創(chuàng)建的,用來接收發(fā)送到某個目的地的消息的這些對象之間的如下圖所示:1.5開發(fā)一個基于 JMS 的消息客戶端應(yīng)用的編程步驟使用JNDI查找一個ConnectionFactory對象。使用JNDI查找一個或者多個Destination對象。使用ConnectionFactory創(chuàng)建一個JMS連接使用連接創(chuàng)建一個或者多個JMS Sess使用Sesand Destinations 創(chuàng)建
17、所需的MessageProducers 和MessageConsumers告知Connection 開始傳送消息。1.6有關(guān)多線程方面4MessageConsumerQueueReceiverQueueBrowserTopicSubscriberJMS可能被要求所有它的對象都支持并發(fā)使用。由于支持并發(fā)通常會增加一些難度和復(fù)雜性,所以設(shè)計限定只有那些被多線程客戶端可自然而然就共享的對象提供滿足并發(fā)的需求,剩余對象被設(shè)計為一次只能有一個邏輯線程。下表列出了對JMS對并發(fā)的支持情況。5對象是否支持并發(fā)Destination是ConnectionFactory是Connection是Ses否Messa
18、geProducer否MessageConsumer否第2章JMS 消息模型2.1背景:企業(yè)級的消息產(chǎn)品將消息看做包括一個“頭”(header)和一”(body)的“輕量級”條目?!跋㈩^”包含一些用于消息路由和消息識別的字段?!跋Ⅲw”中包含了被發(fā)送的應(yīng)用數(shù)據(jù)。在這種通常的格式下,不同的消息產(chǎn)品對于消息的定義會有很大的不同。這些不同主要是“消息頭”的內(nèi)容和語義。一些產(chǎn)品使用自我描述的、規(guī)范編碼的消息數(shù)據(jù),而其他則以完全不透明的方式處理數(shù)據(jù)。一些產(chǎn)品提供一個消息的描述,這些描述用于識別和解釋消息的內(nèi)容,而其他的產(chǎn)品則不會。這就使得 JMS 把握這些消息模型的常見的尺度變得非常。2.2目標(biāo):JM
19、S消息模型目標(biāo)如下:提供一個單獨,的消息API。提供一個用于創(chuàng)建消息能夠匹配已有的,非應(yīng)用所使用的格式。支持跨操作系統(tǒng)、機器結(jié)構(gòu)以及計算機語言的異構(gòu)應(yīng)用的開發(fā)。支持包含Java對象的消息。支持包含可擴展標(biāo)記語言(XML)頁面的消息。2.3JMS 消息JMS 消息包含以下組成部分:消息頭(Header) :所有的消息都支持一套相同的頭字段。頭字段包含了客戶端和提供者(provider)用來路由和識別消息的數(shù)據(jù)。消息屬性(Properties ):在標(biāo)準(zhǔn)頭字段之外提供一種內(nèi)建的設(shè)施用于給消息添加可選的頭字段應(yīng)用指定的屬性:提供一種給消息添加應(yīng)用指定的頭字段的機制。標(biāo)準(zhǔn)屬性 :JMS定義的一些標(biāo)準(zhǔn)屬
20、性,即一些有效的、可選的頭字段。Provider指定的屬性:在集成JMS客戶端和provider 內(nèi)在客戶端時可能需要使用Provider指定的屬性,JMS 為這些定義了命名約定。6消息體(Body):JMS定義了幾種類型的消息體,這些消息體覆蓋目前常用的幾種消息樣式。2.4消息頭字段下面的各節(jié)描述了每個 JMS“消息頭”,消息頭的完整信息將被傳遞給所有接收到消息的 JMS 客戶端。JMS 沒有定義傳遞給非 JMS 客戶端的消息頭字段。2.4.1JMSDestinationJMSDestination 消息頭字段包含了消息被發(fā)送到的目的地。當(dāng)消息被發(fā)出的時候,這個字段被忽略。在消息發(fā)送結(jié)束后,
21、消息持有了由發(fā)送方法指定的目的地對象。當(dāng)一個消息被接收的時候,它目的地對象的值必須與它發(fā)出時候賦予的值相等。2.4.2JMSDeliveryModeJMSDeliveryMode頭字段包含了消息發(fā)送時指定的傳送模式信息。在消息被發(fā)送的時候,這個字段被忽略,當(dāng)消息發(fā)送完成后,它持有了由發(fā)送方法所指定的傳送模式。2.4.3JMSMessageIDThe JMSMessageID 頭字段包含了一個唯一的標(biāo)識每一條由提供者發(fā)出消息的值 。在消息被發(fā)送的時候,JMSMessageID被忽略,當(dāng)send方法返回時,這個字段就包含了一個由提供者賦予的值。JMSMessageID 是一個 String 值,這
22、個值用做消息在歷史庫中唯一鍵值。唯一性的確切范圍由提供者定義,但它至少應(yīng)當(dāng)覆蓋提供者的一個特定安裝點上的所有消息。安裝點就是被一系列消息路由器連接的地方。所有的JMSMessageID值必須以前綴ID:開頭。不必保證消息ID值在不同的提供者時也保持唯一。因為消息ID會增加消息的大小,所以如果JMS提供者被提示不在應(yīng)用中使用消息ID時,可能會優(yōu)化消息的開銷。JMS產(chǎn)生者提出一個消息ID的提示。當(dāng)一個客戶端設(shè)置消息產(chǎn)生者消息ID,這就是說,它不依賴于它所產(chǎn)生消息的ID值。如果JMS提供者接受了這個提示,消息必須設(shè)置消息ID為null 。如果消息提供者忽略了這個提示,那么消息ID必須被設(shè)置為正常的唯
23、一值。2.4.4JMSTimestJMSTimest頭字段含有消息被交給提供者去發(fā)送的時間。這個時間不是消息實際7被傳送的時間。因為事務(wù)或其他客戶端對消息的排隊導(dǎo)致實際傳送消息可能會延遲。在消息被發(fā)出的時候 ,JMSTimest被忽略。當(dāng)發(fā)送方法返回的時候,這個字段包含了在發(fā)送方法被調(diào)用和返回時間段之中的一個時間值。這是一個正規(guī)Java毫秒時間格式的時間值。由于timests對創(chuàng)建消息和消息的大小會產(chǎn)生影響,如果應(yīng)用給消息提供者一個不使用timests的一個提示,那么消息提供者可以優(yōu)化消息的開銷。JMS提供者應(yīng)提供timests的功能。當(dāng)客戶端設(shè)置提供者timests時,它所產(chǎn)生的消息不依賴于
24、timest。如果JMS提供者接受了這個提示,消息中的timest值被設(shè)置為0。如果消息提供者忽略了這個提示,那么timest必須設(shè)置為正規(guī)的值。2.4.5JMSCorrelationID客戶端能用JMSCorrelationID 頭字段將一個消息同另一個消息相聯(lián)接。一個典型的用法就是將一個響應(yīng)消息同它的請求消息相連接。JMSCorrelationID 能夠持有以下中的一種:提供者指定的消息ID.應(yīng)用指定的字符串。提供者本地的字節(jié)值。因為每個由JMS提供者發(fā)出的消息都被賦予一個消息ID值,這非常便于通過消息ID進行消息之間的連接。所有的消息ID值必須以ID:作為前綴。在某些情況下,應(yīng)用(由幾個
25、客戶端組成)需要使用應(yīng)用指定的值連接消息。例如:一個應(yīng)用可以使用JMSCorrelationID去持有對一些外部信息的。應(yīng)用指定的值不必以ID:作為前綴。以“ID:”作為前綴被保留給JMS提供者產(chǎn)生的消息ID 。如果提供者支持本地概念上的correlation ID(相關(guān)聯(lián)ID),JMS客戶端可能需要賦予 JMSCorrelationID一個能夠匹配非JMS客戶端要求的值。byte 值就是用于這個目的。沒有本地correlation ID 值的JMS提供者不需要支持byte 值*。使用byte 導(dǎo)致應(yīng)用不具備可移植性。* 它們的setJMSCorrelationIDAsBytes() 和 ge
26、tJMSCorrelationIDAsBytes()方法將拋出異常lang.UnsupportedOperationException.2.4.6JMSReplyToJMSReplyTo頭字段包含一個由客戶端在發(fā)送消息的時候提供的目的地信息 。這個目的地就是回復(fù)這個消息的目的地。發(fā)出的消息帶有一個null JMSReplyTo 值可能表示一些事件或者它們只是一些發(fā)送者認為別人會感的數(shù)據(jù)。帶有JMSReplyTo 值的消息通常期8望能有一個響應(yīng),這個響應(yīng)是可選的,它由客戶端決定。2.4.7JMSRedelivered如果客戶端接收的消息帶有JMSRedelivered指示符設(shè)置,那么可能(但不一
27、定),這個消息過去被發(fā)送了但是沒有被確認。通常,如果消息被再次發(fā)送,提供者必須設(shè)置JMSRedelivered消息頭字段。如果這個字段被設(shè)置為true,這對于消費它的應(yīng)用來說就必須注意額外的重復(fù)處理,因為這個消息過去曾經(jīng)發(fā)送過。 這個頭字段在發(fā)送時沒有任何意義并且被發(fā)送方法設(shè)置為未賦值。2.4.8JMSTypeJMSType頭字段包含了由客戶端在發(fā)送消息時提供的消息類型標(biāo)識。一些消息提供者使用由應(yīng)用發(fā)送的消息定義。type頭字段可以提供者庫中的消息定義。JMS消息沒有定義一個標(biāo)準(zhǔn)的消息定義庫,也沒有定義這個庫中所包含的各種定義名策略。一些消息系統(tǒng)要求每個被創(chuàng)建的應(yīng)用消息都必須有一個消息類型定義
28、,并且每個消息都指定它的類型。為了能夠使JMS工作于這些消息系統(tǒng)提供者,無論應(yīng)用是否使用,JMS客戶端最好賦值JMSType ,這樣可以保證為需要該頭字段的提供者提供了正確的設(shè)置。為了保證移植性,JMS客戶端應(yīng)使用安裝時在提供者消息庫中定義的語義值作為JMSType的值。2.4.9 JMSExpiration在消息被發(fā)送的時候,它的過期時間是發(fā)送方法指定的time-to-live 值加上當(dāng)前的GMT值之和。在發(fā)送方法返回時,這個消息的 JMSExpiration 頭字段就包含了這個值。當(dāng)消息被接收時,它的 JMSExpiration 應(yīng)含有相同的值。如果 time-to-live 被設(shè)置為 0
29、,過期時間被設(shè)置為 0,則表明這個消息永不過期。當(dāng) GMT 晚于了一個未被發(fā)送的消息的過期時間時,這個消息將被銷毀。JMS 沒有定義消息過期通知,客戶端不會接收到過期的消息,但是 JMS不保證那樣的事情不會發(fā)生。2.4.10JMSPriorityJMSPriority 頭字段包含了消息的優(yōu)先級。在消息被發(fā)送的時候,這個字段被忽略,當(dāng)消息發(fā)送完成后,它持有了發(fā)送方法指定的值。JMS定義了10級的優(yōu)先級,0作為最低級,9。除此之外,客戶端可以認為0-4級是普通優(yōu)先級,而5-9作為加速優(yōu)先級。JMS是不強迫提供者嚴(yán)格實現(xiàn)消息的優(yōu)先級順序,但是,最好實現(xiàn)加速消息先于普通消息。92.4.11對消息頭信息
30、如何被設(shè)置的總結(jié)2.4.12重載消息頭字段JMS允許管理者配置JMS使得它能夠重載客戶端指定的JMSDeliveryMode,JMSExpiration及JMSPriority字段的值。如果對消息頭字段進行重載,消息頭字必須反映出管理設(shè)定的值。JMS沒有定義管理者如何重載這些頭字這個管理選項。JMS提供者不一定支持2.5 消息屬性除了頭字段定義的信息以外,Message 接口包含了內(nèi)置的設(shè)置來支持屬性值。因而,這就提供了一種為消息增加可選頭信息的機制。通過消息選擇器,屬性可以使客戶端讓JMS提供者按照應(yīng)用指定的規(guī)則選擇消息。2.5.1屬性名屬性名稱必須遵循消息選擇器標(biāo)識符的規(guī)則。2.5.2屬性
31、值屬性值可以是, byte, short, long, float, double, 以及String(Java語言基本類型和String)10Header FieldsSet ByJMSDestinationSend MethodJMSDeliveryModeSend MethodJMSExpirationSend MethodJMSPrioritySend MethodJMSMessageIDSend MethodJMSTimestSend MethodJMSCorrelationIDCntJMSReplyToCntJMSTypeCntJMSRedeliveredProvider2.5.3
32、使用屬性屬性值在消息發(fā)送前指定,當(dāng)一個客戶接收到一個消息的時候,它的屬性是“只讀”模式的。如果一個客戶端此時試圖設(shè)置屬性值,就會拋出一個MessageNotWriteableException 的異常。屬性值可以一個消息體的值,也可以不必。盡管JMS沒有定義什么應(yīng)該成為屬性,什么不該成為屬性的策略,但是應(yīng)用開發(fā)者應(yīng)當(dāng)注意JMS提供者可能處理消息體數(shù)據(jù)的效率要高于處理消息屬性數(shù)據(jù)。為了獲得最佳性能,應(yīng)用應(yīng)當(dāng)只在它們確實需要自定義一個消息頭的時候才使用消息屬性,而自定義消息頭的主要原因就是為了支持自定義消息選擇。2.5.4屬性值的轉(zhuǎn)換屬性支持以下的轉(zhuǎn)換表。標(biāo)記的情況必須被支持。未標(biāo)記的情況必須拋出
33、JMS MessageFormatException異常。在字符串向數(shù)字轉(zhuǎn)換的時候,如果numeric 的valueOf()方法不能接受一個字符串的值作為一個正確的表式,必須拋出java.lang.NumberFormatException異常。試圖一個null值作Java基本類型的值時,必須按照調(diào)用基本類型相應(yīng)的 valueOf(String)轉(zhuǎn)換方法來處理null值。Row類型的值集合必須按照column類型對待才能讀取。2.5.5屬性值作為對象除了有關(guān)屬性的指定類型的set/get方法外,JMS提供了setObjectProperty/getObjectProperty 方法。這些方法使
34、用對象化的基本類型值支持相同系列的屬性類型。它們的目的是允許在運行時確定屬性類型,而不是在編譯時。他們支持相11byteshortlongfloatdoubleStringXXbyteXXXXXshortXXXXXXXlongXXfloatXXXdoubleXXStringXXXXXXXX同的屬性值轉(zhuǎn)換。setObjectProperty方法接受, Byte, Short,eger, Long, Float,Double 和 String類型值。試圖使用其他類則必須拋出JMS異常MessageFormatException。getObjectProperty 方法只返回null, Byte,
35、Short,eger, Long, Float, Double 和String。如果指定的屬性名不存在,則返回Null值。2.5.6 屬性迭代沒有定義屬性值的順序,要迭代消息的屬性值,使用 getPropertyNames 去獲取屬性名稱的枚舉,然后使用不同屬性的 get 方法去取得屬性值。getPropertyNames 方法不返回 JMS標(biāo)準(zhǔn)頭字段的名字。2.5.7 清空消息屬性值消息屬性可通過clearProperties方法刪除,這使消息只剩下空的屬性集合。新的屬性條目可以被創(chuàng)建和。清空消息屬性條目不會清空消息體的值。不支持一次只刪除一條屬性的方法。2.5.8 不存在的屬性如果用一個名
36、字獲得一個還沒有該名字屬性的屬性值時,那么它的處理看起來和該屬性已存在了一樣,只不過返回一個null值。2.5.9 JMS 定義的屬性JMS為JMS定義的屬性保留了JMSX屬性名前綴。的JMS定義的屬性見下表。新的定義的屬性可以被增加到JMS最近的版本中。除非另有通知,這些支持是可選的。ConnectionMetaData.getJMSXPropertyNames() 返回了所有連接所支持的屬性名。無論JMSX屬性是否被連接所支持,這些屬性都可以被消息選擇器。 如果JMSX屬性沒有出現(xiàn)在消息中,它們被按照所有未存在的屬性一樣對待。在特定消息中存在的JMS定義的屬性是由JMS提供者根據(jù)自身如何控
37、制這個屬性的用途來進行設(shè)置。它可以選擇讓一些消息中包含這些屬性,而在別的消息中去除這些屬性,這些取決于管理或者其他規(guī)則12NamTypeSet ByUseJMSXUserIDStringProvider on用于標(biāo)識發(fā)送消息的用戶。消息的生產(chǎn)者和消費者都能得到由提供者在發(fā)送消息時設(shè)置的JMSX屬性。而提供者在消息接收時設(shè)置的JMSX屬性只能被消費者得到。如果客戶端想對消息進行分組,那么JMSXGrou和 JMSXGroupSeq 是標(biāo)準(zhǔn)的屬性。所有的提供者必須支持這兩個屬性。這些JMSX屬性名稱的大小寫必須按照上表的定義。除非特別說明,JMSX屬性的值和語義是未定義的。13SendJMSXAp
38、StringProvider onSend用于識別發(fā)送消息的應(yīng)用。JMSXDeliveryCountProvider onReceive這消息發(fā)送嘗試的次數(shù)。第一次是1,然后是2.JMSXGrouStringCnt用來表示消息是哪個組的一部分。JMSXGroupSeqCnt表示消息在組內(nèi)的順序號第一個消息是1,第二個是2,JMSXProducerTXIDStringProvider on Send事務(wù)標(biāo)識符,用來表示消息是在哪個事務(wù)中產(chǎn)生的。JMSXConsumerTXIDStringProvider onReceive消息標(biāo)識符,用來說明消息是在哪個事務(wù)中被消費的。JMSXRcvTimest
39、longProvider on Receive消息被發(fā)送到消費者時的時間。JMSXSeProvider設(shè)想有一個消息倉庫保存每個被發(fā)給消費者消息的拷貝,并且這些拷貝從消息開始發(fā)出之時就存在。每個拷貝的狀態(tài)是如下:1(waiting), 2(ready), 3(expired) or 4(retained).因為產(chǎn)生者和消費者都不關(guān)心狀態(tài),所以這個屬性只是用于在倉庫中查詢消息,并且JMS沒有為其提供任何的 API。2.5.10 提供者指定的屬性JMS保留了JMS_作為提供者指定的屬性名稱前綴。每個提供者定義它們自己的。這就是JMS提供者用來指定它能給JMS客戶端帶來的特定的消息服務(wù)的措施。提供者
40、指定屬性目的在于支持使用“提供者本地客戶端”所需要的特性。這些屬性不應(yīng)被用于JMS或者JMS消息。2.6 Message 確認所有的JMS消息支持acknowledge方法,這個方法用于客戶端已經(jīng)指定消費者的消息被顯示地確認。如果客戶端使用自動確認,調(diào)用,acknowledge方法將被忽略。2.7消息接口Message 是所有消息的根接口。它定義了JMS 消息的頭字段,屬性設(shè)施和 acknowledge 方法。2.8Message 選擇很多消息應(yīng)用需要過濾消息或?qū)λ鼈儺a(chǎn)生的消息進行分類。在消息只發(fā)給一個接收者的時候,將消息過濾規(guī)則加在消息上能夠合理提高效率,使得接收的客戶端不理會它不感的消息。
41、當(dāng)消息廣播給很多客戶端時,將效率規(guī)律規(guī)則加在消息頭上更加有用,以便JMS提供者可以知道這個規(guī)則。這使得提供者可以處理這些大量的過濾和路由工作,否則,這些工作就要由應(yīng)用程序自己去做。JMS提供了這種機制讓客戶端將“消息選擇”給它們的JMS提供者。這簡化了客戶端的工作,并且讓JMS提供者減少了因發(fā)送給客戶端不需要的消息而浪費的時間和帶寬??蛻舳送ㄟ^使用消息屬性來制定應(yīng)用指定的消息選擇規(guī)則??蛻舳送ㄟ^消息選擇器表達式來指定消息的選擇規(guī)則。2.8.1 Message 選擇器消息選擇器可由客戶端通過消息頭指定它所感的消息。只有消息頭和屬性能夠匹配的消息才能傳送給客戶端。根據(jù)消息消費者的不同,“不傳送”的
42、語義會有一點不同。參見“QueueReceiver”和“TopicSubscriber”來獲取詳細信息。消息選擇器不涉及消息體14的值。用消息頭字段和屬性值替換消息選擇器中的標(biāo)識符后,如果求值為true的,表示消息同消息選擇器相匹配。2.8.2 消息選擇語法消息選擇器是一個字符串,這個字符串的語法是基于條件表達式語法SQL92*的一個子集。 如果消息選擇器的值是一個空字符串,這個值被按照null處理,并且說明沒有為消息消費者設(shè)定消息選擇器。消息選擇器的取值順序是從左到右,括號能夠改變這個順序。在這里用大寫來表示預(yù)先定義的選擇器的文字和操作符。但是,他們實際上是大小寫無關(guān)的。一個選擇器包括如下:
43、Literals:文字字符串文字由一個單引號括起來表示,字符串中的單引號用兩個單引號表示。例如:literal and literals.如同Java String文字一樣,都使用Unicode字符編碼。精確的數(shù)字文字是不帶有小數(shù)點的數(shù)字值,例如57, -957, +62;支持Java long的取值范圍。近似的數(shù)字文本是一個使用科學(xué)技術(shù)法表示的值,例如: 7E3 and -57.9E2,或者帶有小數(shù)的數(shù)字,例如7., -95.7, and +6.2;支持Java double的取值范圍。近似文字使用Java浮點數(shù)文字語法。文字是TRUE 和 FALSE.Identifiers:標(biāo)識符標(biāo)識符是
44、沒有長度限制的字符串,必須以Java標(biāo)識符字符開頭。所有允許的字符必須是Java標(biāo)識符允許的字符。標(biāo)識符的開始字符是任何Character.isJavaIdentifierStart返回為true的值。這包括_ 和$。表示符的組成字符是任何Character.isJavaIdentifiart返回為true的字符。標(biāo)識符不能是NULL, TRUE, 或 FALSE.標(biāo)識符不能是NOT, AND, OR, BET標(biāo)識符可以是頭字段或者屬性的N, LIKE, IN, IS, 或者ESC.,消息選擇器中的屬性值類型應(yīng)該與設(shè)置屬性時使用的類型一致。如果消息中不存在的屬性被了,它的值是NULL。在消息選
45、擇器中求NULL值的語義在后面的“Null Values.”中詳細描述。屬性get方法中的轉(zhuǎn)換不適用于消息選擇器表達式,例如:把一個屬性設(shè)置為一個字符串值,如下: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下面選擇器表達式的取值為f a l s e ,因為字符串不能被用于數(shù)學(xué)表達式。 Numb e rOfOr d e r s1 標(biāo)識符是大小寫敏感的。的消息頭字段僅限于: JMSDeliveryMode,JMSPriority, JMSMessageID,可, JMSCorrelat
46、ionID, andJMSType.而且 JMSType 值可以是null,如果JMSTimestJMSType 值是null,那么被當(dāng)作NULL處理。任何以JMSX開始的名字都是JMS定義屬性名。任何以JMS_開頭的名字都是提供者指定的屬性名。任何不是以JMS開頭的名字都是應(yīng)用指定的屬性名??崭裢琂ava中定義的一樣:空格,水平tab,制表符和行結(jié)束符。Express表達式選擇器是條件表達式,選擇器表達式求值為true表示匹配,為false 或者unknown表示不匹配。數(shù)學(xué)表達式由數(shù)學(xué)操作符,帶有數(shù)字值的標(biāo)識符和數(shù)字文本組成。條件表達式由比較操作符,邏輯操作符,帶有值的標(biāo)識符以及文本組成。
47、支持用標(biāo)準(zhǔn)的括號()來改變求值順序。邏輯操作符的優(yōu)先順序為:NOT, AND, OR比較操作符: =, , =, , =, (不等于)只有相同類型的值可以進行比較,一個例外就是,比較確且的數(shù)字和近似數(shù)字是 正確的(需要的類型轉(zhuǎn)換是由JAVA數(shù)字說明(numeric promotion)規(guī)則定義的)。如果試圖比較類型不一樣的值,那么操作的結(jié)果就是false。如果兩個類型中任何一個值是NULL,那么比較的結(jié)果就是unknown.String 和才是相等的。的比較僅限于= 和 只有兩個字符串包含相同序列的字符時數(shù)學(xué)操作符的優(yōu)先順序是:+, - (一元操作符)*, / (乘和除)+, - (加和減)數(shù)
48、學(xué)操作符必須使用Java numeric promotion.arithmetic-expr1 NOT BETN arithmetic-expr2 AND arithmetic-expr3(比較操作符)age BETN 15 AND 19”等價于 “age = 15 AND age = 19”16age NOT BETN 15 AND 19” 等價于 “age 19”identifier NOT IN (string-literal1, string-literal2,.) (比較操作符,這里 identifier 是一個String or NULL 值 )表達式“Country IN ( U
49、K, US, France)”對于Country值為UK返回true,Peru返回false,相當(dāng)于表達式 ”(Country = UK) OR (Country = US) OR (Country = France)”表達式 “Country NOT IN ( UK, US, France)” 對于Country值為UK返回false ,而Peru則返回true,它等價于表達式 “NOT (Country = UK) OR (Country= US) OR (Country = France)”如果IN 或者NOT IN 操作的identifier是NULL,表達式返回值將是unknown.
50、identifier NOT LIKE pattern-value ESCesc-character (比較操作符,這里identifier有一個String值; pattern-value is是一個字符串文本,在這個文本中_ 代表任何單個字符; % 代表任何字符串,包括空串和所以其他串,可選的esc-character是一個單字符(single-characte)的string文本,它的字符用于規(guī)避pattern-value 中_ 和% 的含義)?!皃hone LIKE 12%3” 當(dāng)phone是123或12993的時候返回true,當(dāng)phone是1234的時候返回false?!皐ord
51、LIKE l_se”當(dāng)work是lose返回true, 當(dāng)loose 時返回 false?!皍nderscored LIKE _% ESC回false.”當(dāng)underscored值為_foo返回true,值為bar返“phone NOT LIKE 12%3”當(dāng)phone值為123和 12993 返回false,當(dāng)phone值為1234返回true。如果LIKE 或 NOT LIKE中的標(biāo)識符是NULL值,那么操作結(jié)果為unkonwn。identifier IS NULL (比較操作符,用來測試空的頭字或者丟失的屬性值)“prop_name IS NULL”identifier IS NOT N
52、ULL (比較操作符,用來測試非空的頭字存在或者數(shù)值的存在。)“prop_name IS NOT NULL”當(dāng)選擇器出現(xiàn)的時候,JMS提供者不必驗證消息選擇器的語法正確性。一個提供錯誤語法選擇器的方法將導(dǎo)致一個JMS InvalidSelectorException異常。JMS提供者也可以在選擇器出現(xiàn)時,有選擇性地提供一些語義檢查。不是所有的語法檢查都可在消息選擇器出現(xiàn)時能夠進行,因為屬性類型是未知的。下面的語法選擇器選擇了消息類型為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語義的定義?,F(xiàn)在簡單描述這些語義。將NULL值看作unknown。帶有unknown值的比較或者數(shù)學(xué)操作通常得到unknown結(jié)果。IS NULL 及unknown的頭或者屬性值轉(zhuǎn)化為相應(yīng)的TRUE 和FALSE值。義的“三值”邏輯:IS NOT NULL 操作符將操作符使用按照下表所定操作符的定義OR 操作符定義NOT 操作符定義2.8.4 特別說明.當(dāng)JMSDeliveryMode被用在消息選擇器中時,它被按照有PERSISTENTNON
54、_PERSISTENT值處理。及18NOTTFFTUUORTFUTTTTFTFUUTUUANDTFUTTFUFUUFU日期(Date)和時間(Time)值使用標(biāo)準(zhǔn)的long 型Java毫秒值。當(dāng)一個日期或者時間文本被包含在一個消息表達式中時,它應(yīng)當(dāng)是一個毫秒的整數(shù)文本。產(chǎn)生毫秒值的標(biāo)準(zhǔn)的方式是使用java.util.Calendar。盡管支持固定的小數(shù)比較或者數(shù)學(xué)計算,但JMS 消息選擇器并不支持,這也是僅支持那些沒有小數(shù)的精確的數(shù)字文本的原因(并且數(shù)字與小數(shù)相加是表示近似數(shù)的另法)。SQL注釋被支持。2.9被發(fā)送的消息在消息被發(fā)送后,客戶端可以保留并且更改這個消息而不影響已被發(fā)出的消息。相同
55、的消息對象可以被多次發(fā)送。在執(zhí)行sending方法期間,消息不能被客戶端更改,如果它被更改了,那么發(fā)送結(jié)果就是未定義。2.10 改變已接收的消息的值當(dāng)消息被接收到時,它的頭字段的值能被改變。但是它的屬性和它的body內(nèi)容是只讀的。正如在本章中提到的,只讀限制的原因是它給JMS providers在如何實現(xiàn)接收到消息的管理方面的。比如,它們返回了一個消息對象,這個消息對象了的消息隊列中的屬性條目和Body值,而不是被強迫實現(xiàn)一個拷貝。在調(diào)用clearBody 或clearProperties方法之后使得body或者屬性可寫,從而消費者能夠更改接收到的消息。如果消費者更改了接收的消息,并且消息然后
56、被再次傳送,那么被再次傳送的消息必須是原始的,未被改變的消息(作為重新傳送的結(jié)果,除了被JMS provider 更改的頭和屬性之外,例如JMSRedelivered 頭和MSXDeliveryCount屬性,其他屬性和頭信息都不能被更改)。2.11 JMS 消息體JMS提供五種格式的消息體。每種格式都通過一個消息接口定義。StreamMessage 消息體包含了一個Java primitive 流,這個流被順序地填充和。MapMessage 消息體包含了一系列的名字-值對。名字是Strings,而值則是Java primitive類型。消息體中的條目可以被enumerator按照順序有定義。
57、,也可以。條目的順序沒19TextMessage 消息體包含了一個java.lang.String. 包含這種這種消息類型是考慮到String消息將被廣泛使用的前提。另外一個原因就是XML將可能變成一種用來表示JMS消息內(nèi)容的主流機制。ObjectMessage 消息包含了一個可序列化的Java對象.如果需要Java對象集合(collection),可以是JDK 1.2提供的集合類型中的任何一種。BytesMessage 消息包含了一個不間斷的字節(jié)流。這個消息類型是用來以文字方式編碼一個消息體以匹配存在的消息格式。在很多種情況下,它可能被用于以下用途:自定義的消息類型,盡管JMS允許使用帶有字
58、節(jié)的消息屬性,但它們通常不能被使用,因為包含的屬性可以影響格式。2.11.1 清空消息體clearBody方法重置消息體為empty初始消息值,如同這個消息類型被Sescreate方法創(chuàng)建時一樣。清空消息體不會清空它的屬性條目。提供的2.11.2“只讀消息體”當(dāng)消息被接收到的時候,消息體是只讀的。如果試圖改變消息體。MessageNotWriteableException將被拋出。如果它的消息體被清空,那么消息同它被創(chuàng)建時是一樣的。2.11.3 由 StreamMessage 和MapMessage 提供的轉(zhuǎn)換功能StreamMessage和MapMessage都支持相同的primitive數(shù)
59、據(jù)類型。類型可通過使用每種類型的方法顯式地讀寫。例如,調(diào)用MapMessage.set(“foo”, 6)方法等價于MapMessage.setObject(“foo”, neweger(6)。兩種方法都被提供是因為顯示格式便于靜態(tài)編程,并且當(dāng)類型在編譯時不知道的時候就可以使用對象格式。StreamMessage和 MapMessage都支持下面的轉(zhuǎn)換表。打標(biāo)記的情況必須被支持。未打標(biāo)記的情況必須拋出JMS MessageFormatException。如果數(shù)字的valueOf() 方法不能接受字符串的值作正確的表達式,那么String到 numeric 的轉(zhuǎn)換必須拋出java.lang.Nu
60、mberFormatException .20byteshortcharlongfloatdoubleStringbyteXXbyteXXXXX.試圖讀一個空值作為Java主類型必須被按照調(diào)用主類型相應(yīng)的帶有null值的valueOf(String)轉(zhuǎn)換方法來對待。因為char不支持String轉(zhuǎn)換,所以試圖一個null值作為一個char必須拋出NullPoerException異常。通過字段名獲得MapMessage的字段已經(jīng)存在,其值為null來對待。,而這個字還沒有被設(shè)置,這種情況按照字如果StreamMessage 或BytesMessage 的方法拋出MessageFormatExc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南生物機電職業(yè)技術(shù)學(xué)院《酒店營銷實務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 【物理】《同一直線上二力的合成》(教學(xué)設(shè)計)-2024-2025學(xué)年人教版(2024)初中物理八年級下冊
- 高考物理總復(fù)習(xí)《計算題》專項測試卷含答案
- 重慶醫(yī)藥高等專科學(xué)?!毒G色設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶公共運輸職業(yè)學(xué)院《算法分析與設(shè)計A》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州電子商務(wù)職業(yè)學(xué)院《人文地理學(xué)實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江科技學(xué)院《工程地質(zhì)與地基基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國青年政治學(xué)院《第二外語日語》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州汽車工程職業(yè)學(xué)院《走近微電子》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)“三定一聘”工作實施方案
- 臨時用電拆除方案
- 詩經(jīng)研究課程教學(xué)大綱
- 垂體瘤診療規(guī)范內(nèi)科學(xué)診療規(guī)范診療指南2023版
- 三年級道德與法治教學(xué)工作總結(jié)
- 托卡馬克等離子體約束
- 各級各類護理人員崗位職責(zé)
- 狂犬病與破傷風(fēng)的同意告知書
- FZ/T 81013-2016寵物狗服裝
- PPVT幼兒語言能力測試題附答案
- JB∕T 14089-2020 袋式除塵器 濾袋運行維護技術(shù)規(guī)范
- 陜西省寶雞市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
評論
0/150
提交評論