在公司快兩年了,也跟着團隊做了幾個項目;期間寫過很多個接口,有使用webServices的,也有JMS的。之前的文章說過了webService的接口,這次想簡單談談JMS,由於本身就屬於中的菜鳥,有不好的地方;請手下留情勿拍磚!
1.jms的定義
jms 即(java message service)java 消息服務,是一組 Java 應用程序接口,用以提供創建、發送、接收、讀取消息的服務。SUN 只提供接口,由不同的廠商根據該接口提供自己的實現。
2.JMS 的目標
更好地理解 JMS 有助於瞭解 JMS 規範的制定者設置的目標。現在,市場上有許多企業消息產品,生產這些產品的幾家公司也參與了 JMS 的開發。
現有的這些系統的能力和功能各不相同。這些制定者知道如果 JMS 結合所有現有系統的所有功能,那麼它會變得過於複雜。同樣,他們相信,他們也不能讓 JMS 只侷限於所有系統共有的那些特性。
制定者相信,讓 JMS 包括實現“高級的企業應用程序”所需要的所有功能是很重要的。
JMS 規範中聲明, JMS 的目標是:
- 定義一組消息公用概念和實用工具。
- 最少化程序員使用消息時必須學習的概念。
- 最大化消息應用程序的可移植性。
- 最小化實現一個提供者所需的工作量。
- 爲點對點和 pub/sub域 提供客戶機接口。“域”是用於在前面討論的消息模型的 JMS 術語。(注意:提供者不需要實現兩個域。)
3.jms的模式
(1)點到點(point -to -point) ,
圖中 clientA-->clientC,clientA-->clientD 就是 點到點 的模式; 其中clientA 就是 生產者,C和D就是消費者;
使用這種模型,客戶端發送消息到隊列目的地(Queue),從這個隊列裏面只有一個消息接收者可以收到那個消息,其他訪問同一目的地的接收者不會接收到該消息
如clientC 從A那裏消費了msg1 消息後,D就不能消費同樣的消息了;所以clientD 消費Msg2。
點到點的模式主要特點就是:
① 每條消息只能有一個消費者(customer);一旦一條message被消費了之後,就不能被其他消費者接收。
②發送和接收消息和時間(時效)關係不大,但是要有一個前提就是:就是消息沒有過期,沒有被其他用戶接收走
③ 消費者必須確認消費被接收,否則JMS服務提供者會認爲該消息沒有被接收,那麼這條消息仍然可以被其他人接收。程序可以自動進行確認,不需要人工干預。
④非持久的消息最多隻發送一次
⑤持久的消息嚴格發送一次
我們可以將比較重要的消息設置爲持久化的消息,持久化後的消息不會因爲JMS服務提供者的故障或者其他原因造成消息丟失。
(2)topic(pub/sub) 發佈訂閱模型
關於這個模型,可能比較熟悉;因爲之前在寫redis的高級應用的文章中有提過這個。如圖中的clientB --》clientE 和clientF 就是這個,就發佈者發佈的消息,可以
同時被多個訂閱者接收。
發佈/訂閱模型的特點:
①每個消息都可以有多個(0,1,……)訂閱者
②訂閱者只能消費他們訂閱之後出版的消息
這就要求訂閱者必須先訂閱,生產者再發布。即訂閱者必須先運行,再等待生產者的運行,這和點對點類型有所差異。
③訂閱者必須保持爲活動狀態才能使用這些消息
即訂閱者必須保持活動狀態等待發布者發佈的消息,如果訂閱者在發佈者發佈消息之後才運行,則不能獲得先前發佈者發佈的消息。
4.JMS的消息中間件
說到這裏要先解釋一下MOM?
面向消息中間件(mom)爲分佈式應用 系統開發提供異步,解耦,穩定,可擴展和安全的行爲。mom在分佈式計算領域是一個重要的概念。它允許應用
開發使用代理器api在分佈式應用 環境實現各種功能。總之,mom的設計原理就是作爲消息發送者和接收者的中間人使用。這個中間人提供了一個高級別的解耦。
而且由於jms是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通信。Java消息服務是
一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。接下來就介紹下這幾種mom:
1).IBM MQ 系列產品提供的服務使得應用程序可以使用消息隊列進行交流,通過一系列基於 Java 的 API 提供了 MQseries 在 Java 中應用開發的方法。它支持點到點和發佈/訂閱兩種消息模式。
2).WebLogic是BEA公司實現的基於工業標準的J2EE應用服務器,支持大多數企業級JavaAPI,它完全兼容 JMS 規範,支持點到點和發佈/訂閱消息模式,它支持消息的多點廣播、持久消息存儲的文件和數據庫、XML 消息,以及動態創建持久隊列和主題。
3).JBoss 是 JBoss 公司開發的一個免費開源的應用服務器,它提供了
EJB 運行的環境,並能夠結合 EJB 進行 JMS 消息的收取,支持點到點模型和發佈/訂閱模型。
4).ActiveMQ 是一個基於 Apache 2.0 Licenced 發佈的開放源代碼的 JMS 產品,它能夠提供點到點消息模式和發佈/訂閱消息模式,支持 JBoss、Geronimo 等開源應用服務器,支持 Spring 框架的消息驅動,新增了一個 P2P 傳輸層,可以用於創建可靠的 P2P JMS 網絡連接,擁有消息持久化、事務、集羣支持等 JMS 基礎設施服務。
5).OpenJMS 是一個開源的 JMS 規範的實現,它支持點對點模型和發佈/訂閱模型,支持同步與異步消息發送、可視化管理界面,支持 Applet,能夠與 Jakarta Tomcat 這樣的 Servlet容器結合,支持 RMI、TCP、HTTP 與 SSL 協議。
我之前參與幾個項目中就用到IBM WebSphere MQ,以及activemq ;當然這些都是後話了。
5.jms 的接口
jms的接口如圖中所示,(以及jms的兩種模式繼承的接口):
JMS Parent |
PTP Domain |
Pub/Sub Domain |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver |
TopicSubscriber |
jms接口的描述:
ConnectionFactory:連接工廠,JMS用它創建連接
Connection:JMS 客戶端到JMS Provider 的連接
Destination:消息的目的地
Session:一個發送或接收消息的線程
MessageProducer: (message的生產者)由Session對象創建的用來發送消息的對象
MessageConsumer: (message的消費者)由Session對象創建的用來接收消息的對象
6.jms的消息
jms的消息由三模塊組成的: header(消息頭)、屬性、和body(消息實體)
消息頭:主要是設置消息的失效時間、提供發送和接收識別標識、消息路由等 :如header.setJMSMeassageId();
屬性:由消息發送者產生,用來添加刪除消息頭以外的附加信息。 名稱沒有限制,用戶可隨便定義;分三類:應用程序定義屬性、JMS定義屬性、提供者自定義屬性
消息實體: 發送到接收應用程序的內容。每一個消息接口都專用於它所支持的內容類型。JMS中定義了5種消息體:ByteMessage、MapMessage、ObjectMessage、StreamMessage和 TextMessage。
7.jms開發編程實現
一個完整的jms 開發流程:
(1).通過 JNDI 查詢 ConnectionFactory
。
(2).通過 JNDI 查詢一個或者多個 Destination
。
(3).用 ConnectionFactory
創建一個Connection
。
(4).用 Connection
創建一個或者多個Session
。
(5)用 Session
和
Destination
創建所需要的 MessageProducer
和MessageConsumer
。
(6)啓動 Connection
。