JMS簡介:html
JMS即Java消息服務(Java Message Service)應用程序接口是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。java
定義:JMS(java Messaging Service)是Java平臺上有關面向消息中間件(MOM)的技術規範,它便於消息系統中的Java應用程序進行消息交換,而且經過提供標準的產生、發送、接收消息的接口簡化企業應用的開發,翻譯爲Java消息服務。JMS是一種與廠商無關的 API,用來訪問消息收發系統消息。它相似於JDBC(Java DatabaseConnectivity):這裏,JDBC 是能夠用來訪問許多不一樣關係數據庫的 API,而 JMS 則提供一樣與廠商無關的訪問方法,以訪問消息收發服務.數據庫
概念:網絡
使用JMS 的應用程序被稱爲JMS 客戶端,處理消息路由與傳遞的消息系統被稱爲JMS Provider,而JMS 應用則是由多個JMS 客戶端和一個JMS Provider 構成的業務系統。發送消息的JMS 客戶端被稱爲生產者(producer),而接收消息的JMS 客戶端則被稱爲消費者(consumer)。同一JMS 客戶端既能夠是生產者也能夠是消費者。session
基本概念數據結構
JMS是java的消息服務,JMS的客戶端之間能夠經過JMS服務進行異步的消息傳輸。負載均衡
消息模型異步
○ Point-to-Point(P2P) ○ Publish/Subscribe(Pub/Sub)
即點對點和發佈訂閱模型socket
P2P分佈式
PTP(point-to-point)即點對點消息傳輸模型。PTP以下圖所示:
咱們能夠看到,一個或多個生產者發送消息,消息m2先抵達了queue,而後m1也發出了,並一同存在於一個先進先出的queue裏面。消費者也存在一個或多個,對queue裏的消息進行消費。但消息被隨機的一個消費者消費且僅消費一次。
P2P的特色
若是你但願發送的每一個消息都應該被成功處理的話,那麼你須要P2P模式。
Pub/Sub
Pub/Sub的特色
若是你但願發送的消息能夠不被作任何處理、或者被一個消息者處理、或者能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模型
Queue與Topic的比較
1. JMS Queue執行load balancer語義
一條消息僅能被一個consumer收到。若是在message發送的時候沒有可用的consumer,那麼它講被保存一直到能處理該message的consumer可用。若是一個consumer收到一條message後卻不響應它,那麼這條消息將被轉到另一個consumer那兒。一個Queue能夠有不少consumer,而且在多個可用的consumer中負載均衡。
2. Topic實現publish和subscribe語義
一條消息被publish時,他將發送給全部感興趣的訂閱者,因此零到多個subscriber將接收到消息的一個拷貝。可是在消息代理接收到消息時,只有激活訂閱的subscriber可以得到消息的一個拷貝。
3. 分別對應兩種消息模式
Point-to-Point(點對點),Publisher/Subscriber Model(發佈/訂閱者)
其中在Publicher/Subscriber模式下又有Nondurable subscription(非持久化訂閱)和durable subscription(持久化訂閱)兩種消息處理方式。
消息的消費
在JMS中,消息的產生和消費是異步的。對於消費者來講,JMS的消費者能夠經過兩種方式來消費消息。
○ 同步
訂閱者或接收者調用receive方法來接收消息,receive方法在可以接收到消息以前(或超時以前)將一直阻塞
○ 異步
訂閱者或接收者能夠註冊爲一個消息監聽器。當消息到達以後,系統自動調用監聽器的onMessage方法。
MQ(JMS Provider)
MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通訊方法。應用程序經過寫和檢索出入列隊的針對應用程序的數據(消息)來通訊,而無需專用鏈接來連接它們.
JMS和MQ的關係:
JMS是一個用於提供消息服務的技術規範,它制定了在整個消息服務提供過程當中的全部數據結構和交互流程。而MQ則是消息隊列服務,是面向消息中間件(MOM)的最終實現,是真正的服務提供者;MQ的實現能夠基於JMS,也能夠基於其餘規範或標準。
支持JMS的開源MQ:
目前選擇的最多的是ActiveMQ。
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現.
JMS接口API
流程以下:
發送端的標準流程是:建立鏈接工廠>建立鏈接>建立session>建立發送者>建立消息體>發送消息到Destination(queue或topic)。
接收端則爲:建立鏈接工廠>建立鏈接>建立session>建立接收者>建立消息監聽器監聽某Destination的消息>獲取消息並執行業務邏輯
接口簡介:
頂級接口 |
P2P |
Pub/sub |
備註 |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
基於工廠模式,建立和JMS提供者之間的連接,須要制定連接的URL或者協議;任何JMS客戶端和JMS提供者之間的交互,都必須基於制定的鏈接. |
Destination |
Queue |
Topic |
「目的地」,用於描述消息的通道類型,是JMS提供者用於標記消息歸屬類型的」標記」. Destination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來講,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來講,它的Destination也是某個隊列或主題(即消息來源)。 因此,Destination實際上就是兩種類型的對象:Queue、Topic |
Connection |
QueueConnection |
TopicConnection |
Connection表示在客戶端和JMS系統之間創建的連接(對TCP/IP socket的包裝)。Connection能夠產生一個或多個Session。跟ConnectionFactory同樣,Connection也有兩種類型:QueueConnection和TopicConnection。 |
Session |
QueueSession |
TopicSession |
「會話」,在邏輯上用於區分JMS客戶端,由於」連接」可被公用以提升網絡利用率;每一個session能夠支持相互獨立的」事務」和相關屬性.每一個session都有ID.
|
Message |
-- |
-- |
「消息」,JMS API中提供了多種類型Message,它們有各自的」序列化/反序列化」機制;消息中能夠包含多種JMS屬性以及客戶端自定義的消息屬性和內容. |
MessageProducer |
QueueSender |
TopicPublisher |
「生產者」,一種能夠向JMS提供者提交消息的客戶端類型. |
MessageConsumer |
QueueReceiver |
TopicSubscriber |
「消費者」,一種能夠向JMS提供獲取消息的客戶端類型. |
至此,JMS的基本概念以及經常使用的接口Api大體瞭解.更深層次的理解須要在實際的業務代碼中去理解.
參考:
http://www.cnblogs.com/whsa/p/4223728.html
http://blog.csdn.net/jiuqiyuliang/article/details/46701559