摘要:The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.java
JMS(JAVA Message Service,java消息服務)API是一個消息服務的標準或者說是規範,容許應用程序組件基於JavaEE平臺建立、發送、接收和讀取消息。它使分佈式通訊耦合度更低,消息服務更加可靠以及異步性。編程
這篇博文咱們主要介紹J2EE中的一個重要規範JMS,由於這個規範在企業中的應用十分的普遍,也比較重要,咱們主要介紹JMS的基本概念和它的模式,消息的消費以及JMS編程步驟。服務器
基本概念session
JMS是java的消息服務,JMS的客戶端之間能夠經過JMS服務進行異步的消息傳輸。app
消息模型異步
○ Point-to-Point(P2P) ○ Publish/Subscribe(Pub/Sub)
即點對點和發佈訂閱模型socket
P2Pasync
每一個消息只有一個消費者(Consumer)(即一旦被消費,消息就再也不在消息隊列中)分佈式
發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息以後,無論接收者有沒有正在運行,它不會影響到消息被髮送到隊列spa
接收者在成功接收消息以後需向隊列應答成功
消息隊列(Queue)
發送者(Sender)
接收者(Receiver)
每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,直到他們被消費或超時。
P2P模式圖
涉及到的概念
P2P的特色
若是你但願發送的每一個消息都應該被成功處理的話,那麼你須要P2P模式。
Pub/Sub
每一個消息能夠有多個消費者
發佈者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者以後,才能消費發佈者的消息,並且爲了消費消息,訂閱者必須保持運行的狀態。
爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的消息。
主題(Topic)
發佈者(Publisher)
訂閱者(Subscriber)
客戶端將消息發送到主題。多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
Pub/Sub模式圖
涉及到的概念
Pub/Sub的特色
若是你但願發送的消息能夠不被作任何處理、或者被一個消息者處理、或者能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模型
消息的消費
在JMS中,消息的產生和消息是異步的。對於消費來講,JMS的消息者能夠經過兩種方式來消費消息。
○ 同步
訂閱者或接收者調用receive方法來接收消息,receive方法在可以接收到消息以前(或超時以前)將一直阻塞
○ 異步
訂閱者或接收者能夠註冊爲一個消息監聽器。當消息到達以後,系統自動調用監聽器的onMessage方法。
JMS編程模型
(1) ConnectionFactory
建立Connection對象的工廠,針對兩種不一樣的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。能夠經過JNDI來查找ConnectionFactory對象。
(2) Destination
Destination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來講,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來講,它的Destination也是某個隊列或主題(即消息來源)。
因此,Destination實際上就是兩種類型的對象:Queue、Topic能夠經過JNDI來查找Destination。
(3) Connection
Connection表示在客戶端和JMS系統之間創建的連接(對TCP/IP socket的包裝)。Connection能夠產生一個或多個Session。跟ConnectionFactory同樣,Connection也有兩種類型:QueueConnection和TopicConnection。
(4) Session
Session是咱們操做消息的接口。能夠經過session建立生產者、消費者、消息等。Session提供了事務的功能。當咱們須要使用session發送/接收多個消息時,能夠將這些發送/接收動做放到一個事務中。一樣,也分QueueSession和TopicSession。
(5) 消息的生產者
消息生產者由Session建立,並用於將消息發送到Destination。一樣,消息生產者分兩種類型:QueueSender和TopicPublisher。能夠調用消息生產者的方法(send或publish方法)發送消息。
(6) 消息消費者
消息消費者由Session建立,用於接收被髮送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別經過session的createReceiver(Queue)或createSubscriber(Topic)來建立。固然,也能夠session的creatDurableSubscriber方法來建立持久化的訂閱者。
(7) MessageListener
消息監聽器。若是註冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
企業消息系統的好處
咱們先來看看下圖,應用程序A將Message發送到服務器上,而後應用程序B從服務器中接收A發來的消息,經過這個圖咱們一塊兒來分析一下JMS的好處:
提供消息靈活性
鬆散耦合
異步性
對於JMS的基本概念咱們就介紹這麼多,下篇博文介紹一種JMS的實現。