這兩天面試了一兩個公司,由於簡歷中的最近一個項目用到了JMS,然而面試官似乎對這個很感興趣,所以都被問到了,但可惜的是,我除了說我們使用了JMS外,面對他們提出的一些關於JMS的問題,我回答得相當差,直接結果就是面試失敗。同時我也深深的覺得自己對於技術的掌握是多麼的浮淺,本著從哪裡跌倒就從哪裡爬起來的心態,決定首先好好研究一下JMS。不僅是為面試,也是為了盡可能深入的掌握這個框架。
本文主要介紹一些基本的概念。
JMS是Java Message Service 的簡稱,即Java消息服務。什麼是消息服務呢,我們來看一下Oracle官方的定義:
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.
翻譯過來就是說,JMS是一個消息標准,這種標准允許基於JavaEE的應用組件可以創建,發送,接受及讀取消息。通過JMS可以實現松耦合,可依賴及異步的分布式通信。那麼在這一段話中我們應該注意兩點,即首先這是一個標准,類似於Servlet標准,並不是一個具體的實現。其次,這是一種分布式的通信機制,並且是異步的。
以前沒有注意過這個問題,但是沒想到在面試時居然被問題到了,問我們JMS協議使用的是哪個版本,回來查來下,JMS歷史上原來有兩個比較重要的版本。一個是JMS1.1,另一個就是JMS2.0。那麼這兩個版本之間有什麼區別呢?從網上找了一下答案,整理如下 :
1. 簡化的API: JMS2.0 提供了一些簡化的API,可以簡化代碼編寫,以便於我們更方便的創建生產者消費者等內容。具體來說就是使用了JDK1.7的新語法
2. 簡化配置:配置變得更方便
3. 支持多個消費者共享Topic:,這一點很重要,因為我的項目中使用的是Topic,面試官問到說如何讓多個Node不重復的消費同一個Topic的消息,其實,通過Topic共享就可以做到,這就是JMS2.0提供的特性,當然,1.1的話,通過selector好像是也可以做到。
4. JMSXDeliveryCount值必須設置:這個值代表重試次數,正常來說是1,如果值大於1,則表示重發了多次。
那麼,目前我們常用的MQ都支持哪個版本呢?以ActiveMQ為例來說,其官方文檔的說明如下:
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. Apache ActiveMQ is released under the Apache2.0 License
看來ActiveMQ還不支持JMS2.0,所以,我們目前使用的JMS的版本仍然還是1.1。那麼接下來的系列中,我們還是會以JMS1.1為主來介紹JMS的概念及使用。
在提到JMS時,我們通常會說到一些術語,解釋如下:
1. 消息中間件(JMS Provider) : 指提供了對JMS協議的第三方組件,比如ActiveMQ就是一個消息中間件,另外比較知名的還有KFA, Rabbit MQ等。
2. 消息模式:分為點對點(Point to Point,即P2P)和發布/訂閱(Pub/Sub),對應的數據結構分別是隊列(Queue)和主題(Topic)
3. 消息(Message): 通信內容的載體,其結構主要分為消息頭,屬性和消息體,並且根據存儲結構的不同分為好幾種,後面會詳細提到。
4. 消息生產者:產生消息的一方,在P2P模式下,指消息發送者(Sender),在P/S模式下指消息發布者(Publisher)
5. 消息消費者:接收消息的一方,對應於兩種模式分別是消息接收者(Receiver)和消息訂閱者(Subscriber)
在JMS的標准協議裡,有幾個重要的接口,先簡單羅列如下:
1. ConnectionFactory :創建Connection的工廠,通過這個對象來創建一個到某個消息服務的連接。
2. Connection: 一個具體的連接,由ConnectionFactory創建
3. Session: 由Connection創建的用於操作消息的接口,本接口可以直接用來創建消息的生產者對象
4. Destination:消息存儲的位置,發送者把消息發送到指定位置,消費者從指定位置取消息,那麼這個指定位置可能是一個topic也可能是一個queue,由這個來表示。
5. MessageProducer: 消息的生產者,包括QueueSender和TopicPublisher
6. MessageConsumer: 消息的消費者, 包括QueueReceiver和TopicSubscriber
7. MessageListener: 消息監聽器,這個是提供給消費者監聽消息使用的,在添加了某個監聽器之後,一旦消費到達,則會調用其onMessage方法。
本文簡單的介紹了一下JMS的一些概念,對JMS有了一個初步的了解,後續文章會對本文介紹的一些術語和概念進行分部分詳細的介紹。