訊息中介軟體系列-JMS基本概念和模型
一、定義:
JMS 全稱:Java Message Service,Java訊息服務,是Java EE中的一個技術,它定義了Java
中訪問訊息中介軟體的介面,並沒有給予實現,實現JMS介面的訊息中介軟體成為JMS Provider,例如:Active MQ
二、訊息模型:
○ Point-to-Point(P2P)
○ Publish/Subscribe(Pub/Sub)
即點對點和釋出訂閱模型三、P2P
定義:Point
to Point 傳送者和接收者中有一個訊息佇列(messages quene),傳送者傳送訊息則把訊息加入到佇列中,接收者接收訊息則把訊息從佇列中取出;如果接收者沒有接收,則這條訊息永遠儲存在佇列中(除非已過期)。如下圖:
特點:
A、每條訊息只能有一個接收者
B、傳送者和接收者之間可以非同步(no timing dependencies)
C、接收者成功接收答覆機制
如果你希望傳送的每個訊息都應該被成功處理的話,那麼你需要P2P模式。
四、PUB/SUB(釋出訂閱模式)
定義:傳送者把訊息掛在一個主題下(類似電子公告板),接收者先訂閱這個主題,當這個主題有新訊息釋出時,接收者就可以接收這個主題下的訊息了,這個訊息一直保持到所有訂閱這個訊息的人(線上的)都接收了才刪除。如圖:
特點:
A、一條訊息可以有多個接收者接收
B、接收者和傳送者之間必須同步。
為了彌補這種型別的時間依賴(timing
dependencies)劣勢,JMS API 提供了建立持久訂閱的機制,這樣不管接收者是否線上,傳送者都可以傳送,接收者也可以接收。
五、JMS API程式設計介紹
類圖:
API介紹:
(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。
JMS可以解決那些問題:
(1)同步通訊:客戶發出呼叫後,必須等待服務物件完成處理並返回結果後才能繼續執行;(2)客戶和服務物件的生命週期緊密耦合:客戶程序和服務物件程序都必須正常執行;如果由於服務物件崩潰或者網路故障導致客戶的請求不可達,客戶會接收到異常;(3)點對點通訊:客戶的一次呼叫只發送給某個單獨的目標物件。
作者:scgyus