jms簡介

jms是j2ee的一門技術,j2ee是一個包含20多門技術的總和。

jms定義了java中訪問消息中間件的接口。並沒有給予實現。將實現了jms接口的中間件叫做jms provider,比如activemaq.

jms消息分爲三部分
1,消息頭:每個消息頭字段都有相應的get和set方法
2,消息屬性:如果需要除消息頭字段以外的值,可以用消息屬性
3,消息體:封裝具體的消息

jms producer : 消息生產者,創建和發送jms消息的客戶端應用
jms consumer:消息消費者,接受和處理jms消息的客戶端應用

消息的消費可以採用以下的兩種方法之一:

1,同步消費:通過調用消費者的receive方法從目的地中顯式提取消息,receive方法可以一直阻塞到消息到達
2,異步消費:客戶端可以爲消費者註冊一個消息監聽器,定義在消息到達時所採取的動作。

jms domains:消息傳遞域
1,點對點 :一對一,每個消息只能有一個消費者,可以有多個客戶端來消費,但是每個客戶端得到的數據都是不全的。他們消費的總和是一個完整的消息集。
2,發佈訂閱:一對多,每個消息都可以有多個消費者,每個topic的消費者只能消費自他訂閱之後發佈的消息。jms規範允許客戶端創建持久訂閱,這在一定程度上放鬆了時間上的相關性要求。持久訂閱允許消費者消費他在未處於激活狀態時發送的消息。注意,即使是持久訂閱,依然消費不到訂閱前的消息。比如生活中的訂雜誌,不可能給你訂閱之前的雜誌。

Connection factory: 連接工廠
jms connection: 封裝了客戶與jms提供者之間的一個虛擬連接
jms session: 是生產和消費消息的一個單線程上下文。會話提供了一個事務性的上下文,在這個上下文中,一組發送和接收被組合到了一個原子性操作中。
destination:消息發送到的目的地
acknowledge: 簽收。跟收快遞一樣,收到消息後,消費端要簽收。

transaction:事務

===========================================
jms消息頭
1,JMSDestination:由send方法設置(消息目的地),如果要在send方法裏面指定目的地,則createProducer方法時就不能指定destination。
2,JMSDeliveryMode:由send方法設置(是不是要持久化),也可以由producer去設置。但是不要兩方面同時設置。
3,JMSExpiration:有send方法設置(過期時間,默認是不過期)
4,JMSPriority:由send方法設置(優先級)jms規範裏面,說優先級高的消息,會優先被消費。但是不保證全部是這樣。
5,JMSMessageID: jms provider自動分配
6,JMSTimestamp:在調用send方法時自動設置。可以用這個來計算髮送跟接收消息的時間差
7,JMSCorrelationID:由客戶端設置
8,JMSReplyTo:由客戶端設置,類似於快遞的發件地址,收件人可以根據這個地址來聯繫對方。
9,JMSType:由客戶端(開發者)設置,消息類型的識別符
10,JMSRedilivered:由JMS Provider設置。重新投遞的意思

jms 消息體
jms規範規定了5中格式的消息體
1,TextMessage
2, MapMessage
3,BytesMessage
4,StreamMessage
5,ObjectMessage

消息屬性
1,應用程序設置和添加的屬性,如Message.setStringProperty(“”username”,”張三”)
2,JMS定義的屬性
使用”JMSX”作爲屬性名的前綴,比如:
connection.getMetaData().getJMSXPropertyNames(),返回所有連接支持的JMSX屬性的名字
3,JMS供應商特定的屬性

==================jms可靠性機制========================
消息接收確認
jms消息只有在被確認後,才認爲已經被成功的消費了。消息的成功消費常包含三個階段:客戶端接收消息,客戶端處理消息和消息被確認。
在事務性會話中,當一個事務被提交的時候,確認自動發生。在非事務性會話中,消息何時被確認取決於創建會話時的應答模式。
1,Session.AUTO_ACKNOWLEDGE:當客戶成功的從receive方法返回的時候,或者從MessageListener.onMessage方法成功返回的時候,會話自動確認客戶收到消息。
2,Session.CLIENT_ACKNOWLEDGE:客戶端通過調用消息的acknowledge方法確認消息。需要注意的是,在這種模式中,確認是在會話層上進行,確認一個被消費的消息將自動確認所有已被會話消費的消息。例如,如果一個消費者消費了10個消息,然後確認第5個消息,那麼所有10個消息都會被確認。也即使說確認一個,會導致這個session裏面的數據全部確認。工作中用的最多的也是這種方式,因爲我們處理消息的時候可能會拋異常,這個時候就不簽收,確保消息不丟。
3,Session.DUPS_OK_ACKNOWLEDGE :收到消息後,不發回饋信息。可能會導致消息被重複消費(比如2個consumer消費同一個隊列,由於沒有消息確認機制,可能會導致一條消息同時被2個客戶端都消費了。這裏只是說可能,broker會盡量避免這個問題),但是對於對重複數據要求不高的場合,非常適合。效率高。

消息還可以創建臨時目的地(destination),生命週期僅限於producer連接期間。這個目的地沒有名字。

持久訂閱:
首先生產者必須使用PERSISTENT提交消息。客戶可以通過會話上的createDurableSubscriber方法來創建一個持久訂閱,該方法的第一個參數必須爲topic。第二個參數是訂閱的名稱。

jms provider會存儲發佈到持久訂閱對應的topic上的信息。之後再寫吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章