JMS的定義
JMS即Java消息服務(Java Message Service)應用程式接口,是一個Java平台中關于面向消息中間件(MOM)的API,用于在兩個應用程式之間,或分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平台無關的API,絕大多數MOM提供商都對JMS提供支援,可以類比JDBC技術,不同的廠商對JDBC做了不同的實作。
JMS的組成
JMS由JMS provider、JMS producer、JMS consumer、JMS message組成。下面給出這些概念的定義。
JMS provider
實作JMS接口和規範的消息中間件,也就是我們的MQ服務。
JMS producer
消息生産者,建立和發送JMS消息的用戶端應用。
JMS consumer
消息消費者,接收和處理JMS消息的用戶端應用。
JMS message
JMS message由消息頭、消息體、消息屬性3部分組成。
消息頭
消息頭有5個比較常見的屬性,分别是JMSDestination、JMSDeliveryMode、JMSExpiration
、JMSPriority、JMSMessageID,下面這個表格展示了它們所代表的意義。
屬性 | 意義 |
---|---|
JMSDeliveryMode | 持久和非持久模式,一條持久性的消息應該被傳送“一次僅僅一次“,這就一位着如果JMS提供者出現故障,該消息并不會丢失,它會在伺服器恢複之後再次傳遞。一條非持久的消息最多會被傳送一次,這就意味着伺服器如果出現故障,該消息将永遠丢失 |
JMSExpiration | 可以設定消息在一定時間以後過期,預設是永不過期。消息過期時間等于Destination的send方法中的timeToLive值加上發送時刻的GMT時間值,如果timeToLive值等于零,則JMSExpiration被設為零,表示該消息永不過期。如果發送後,在消息過期時間之後消息還沒有被發送到目的地,則該消息被清除 |
JMSPriority | 消息優先級,從0-9十個級别,0-4是普通消息,5-9是加急消息。JMS不要求MQ嚴格按照這十個優先級發送消息,但必須保證加急消息要先于普通消息到達。預設是4級 |
JMSMessageID | 唯一識别每個消息的辨別由MQ産生 |
JMSDestination | 消息發送的目的地,主要是指Queue和Topic |
下面的代碼示範了怎麼設定這些屬性。
public class JmsProduce {
public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
public static final String QUEUE_NAME = "queue02";
public static void main(String[] args) throws JMSException {
//1.建立連接配接工場,按照給定Url位址,采用預設的使用者名和密碼
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//2通過連接配接工場,獲得連接配接connection并啟動通路
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
//3.建立回話session,第一個參數是事務,第二個參數是簽收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.建立目的地(是隊列還是主題(topic))
Queue queue = session.createQueue(QUEUE_NAME);
//5.建立消息的生産者
MessageProducer messageProducer = session.createProducer(queue);
//6.通過使用messageProducer生産3條消息發送到MQ的隊列裡面
for (int i = 1; i <= 3; i++) {
//7.建立消息
TextMessage textMessage = session.createTextMessage("msg---" + i);
//設定消息頭的屬性
textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //設定消息的持久化
textMessage.setJMSExpiration(400L); //設定消息過期時間
textMessage.setJMSPriority(6); //設定消息優先級
textMessage.setJMSDestination(queue); //設定消息的目的地
//8.通過messageProducer發送給mq
messageProducer.send(textMessage);
}
//關閉資源
messageProducer.close();
session.close();
connection.close();
System.out.println("消息發送到MQ");
}
}
消息體
消息體封裝了具體的消息資料,消息體有五種消息格式,發送和接收的消息體類型必須一緻對應。
五種消息體格式
消息體格式 | 代表的意思 |
---|---|
TextMessage | 普通字元串消息,包含String |
MapMessage | 一個Map類型的消息,key為String類型,值為Java基本類型 |
BytesMessage | 二進制數組消息,包含一個byte[] |
StreamMessage | Java資料流消息,用标準流操作來順序的填充和讀取 |
ObjectMessage | 對象消息,包含一個可序列化的Java對象 |
消息屬性
如果需要去除消息頭字段以外的值,那麼可以使用消息屬性,消息屬性是以屬性名和屬性值對的形式制定的,可以将屬性視為消息頭的擴充,屬性指定一些消息頭沒有包括的附加資訊,比如可以在屬性裡指定消息選擇器。消息的樹形就像可以配置設定給一條消息的附加消息頭一樣。它們允許開發者添加有關消息的不透明附加消息。
消息發送和接收模型
JMS支援兩種消息發送和接收模型,一種是P2P模型,另一種是釋出訂閱(Publish/Subscribe)模型。
P2P模型
P2P模型采用點對點的方式發送和接收消息,P2P模型是基于隊列的,消息生産者發送消息到隊列,消息消費者從隊列中接收消息,因為隊列的存在,消息的異步傳輸成為可能。P2P模型的特點是每個消息隻有一個消費者,當發送者發送消息以後,不管接收者有沒有在運作都不影響消息被釋出到隊列中,接收者在成功接收消息後會向發送者發送接收成功的資訊。
釋出訂閱模型
釋出訂閱模型定義了如何向一個内容節點釋出和訂閱消息,這個内容節點稱為主題(Topic)。隻有先建立訂閱者以後,才可以消費消息生産者的資訊,并且訂閱者需要一直保持運作的狀态。釋出訂閱模型允許一個消息被多個消費者消費,也就是一個消息可以被多個消費者訂閱,每個消費者都可以接收到這個資訊。
這兩個模型的具體使用可以參考我的另一篇文章,文章是以ActiveMQ為例子的。
參考
- JMS視訊
- 一步一步學Spring Boot:微服務項目實戰
- 百度百科