-------------------------------------------------------------------------------------------
JMS是什么
JMS 全稱:Java Message Service,Java消息服務,是Java EE中的一個技術。
JMS規范
JMS定義了Java 中訪問消息中間件的接口,並沒有給予實現,實現JMS接口的消息中間件成為JMS Provider,例如:Active MQ
JMS Provider
實現JMS接口和規范的消息中間件
JMS message
JMS的消息,JMS消息由三部分組成:消息頭、消息屬性、消息體
消息頭包含消息的識別消息和路由消息,消息頭包含一些標准的屬性如下:
(1)JMSDestination: 消息發送的目的地,主要是指Queue和Topic,由send方法設置.
(2)JMSDeliveryMode:傳送模式。有兩種:持久模式和非持久模式。一條持久性的消息應該被傳輸"一次僅僅一次",這就意味着如果JMS提供者出現故障,該消息並不會丟失,它會在服務器恢復之后再次傳遞。一條非持久的消息最多會傳遞一次,這意味着服務器出現故障,該消息將永遠丟失。由send方法設置
(3)JMSExpiration:消息過期時間,等於Destination的send方法中的timeToLive值加上發送時刻的GMT的時間值。如果timeToLive值等於零,則JMSExpiration被設置為零,表示該消息永不過期。如果發送后,在消息過期時間之后消息還沒有被發送到目的地,則該消息被清除。由send方法設置
(4)JMSPriority:消息優先級,從0-9十個級別,0-4是普通消息,5-9是加急消息。JMS不要求JMS Provider嚴格按照這十個優先級發送消息,但必須保證加急消息要先於普通消息到達,默認是4級。由send方法設置
(5)JMSMessageID:唯一識別每個消息的標識,由JMS Provider產生。由send方法設置
(6)JMSTimestamp:一個JMS Provider在調用send()方法時自動設置,它是消息被發送和消費者實際接收的時間差。由客戶端設置
(7)JMSCorrelationID:用來連接到另外一個消息,典型的應用是在回復消息中連接到原消息。在大多數情況下,JMSCorrelationID用於將一條消息標記為對JMSMessageID標示的上一條消息的應答,不過,JMSCorrelationID可以是任何值,不僅僅是JMSMessageID。由客戶端設置
(8)JMSType: 消息類型的標識符,由客戶端設置
(9)JMSReplyTo: 提供本消息回復消息的目的地址,由客戶端設置
(10)JMSRedelivered:如果一個客戶端收到一個設置了JMSRedelivered屬性的消息,則表示可能客戶端曾經在早些時候收到過該消息,但並沒有簽收(acknowledged)。如果該消息被重新傳送,JMSRedelivered=true 否則 JMSRedelivered=flase 。由JMS Provider設置
消息體,JMS API定義了5種消息體格式,也叫消息類型,可以使用不同形式發送接收數據,並可以兼容現有的消息格式。
包括:TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage
消息屬性,包含以下三種類型的屬性:
1.應用程序設置和添加的數據,比如:message.setStringProperty("userName",userName);
2.JMS定義的屬性,使用"JMSX"作為屬性名的前綴, connection.getMetaData().getJMSXPropertyNames() 方法返回所有連接支持的JMSX屬性的名字。
3.JMS供應商特定的屬性
JMS producer
消息生產者,創建和發送JMS消息的客戶端應用
JMS consumer
消息消費者,創建和處理JMS消息的客戶端應用
JMS domains: 消息傳遞域
JMS規范中定義了兩種消息傳遞域: 點對點(point-to-point,簡寫成PTP);消息傳遞域和發布/訂閱消息傳遞域(publish/subscribe,簡寫成pub/sub)
1.點對點消息傳遞域的特點如下:
a.每個消息只能有一個消費者
b.消息的生產者和消費者之間沒有時間上的相關性。無論消費者在生產者發送消息的時候是否處於運行狀態,它都可以提取消息。
2.發布/訂閱消息傳遞域的特點如下:
a.每個消息可以有多個消費者
b.生產者和消費者之間有時間上的相關性。訂閱一個主題的消費者只能消費自它訂閱之后發布的消息。JMS規范允許客戶創建持久訂閱,這在一定程度上放松了時間上的相關性要求。持久訂閱允許消費者消費它在未處於激活狀態時發送的消息。
3.在點對點消息傳遞域中,目的地被稱為隊列(queue);在發布/訂閱消息傳遞域中,目的地被稱為主題(topic)
Connection factory: 連接工廠,用來創建連接對象,以連接到JMS的provider
JMS Connection: 封裝了客戶與JMS提供者之間的一個虛擬的連接
JMS Session: 是生產和消費消息的一個單線程上下文
會話用於創建消息生產者(producer)、消息消費者(consumer)和消息(message)等。會話提供了一個事務性的上下文,在這個上下文中,一組發送和接收被組合到了一個原子操作中。
Destination:消息發送到的目的地
Acknowledge:簽收
Transaction:事務
JMS client: 用來收發消息的Java應用