天天看點

什麼是JMS(消息服務)

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:微服務項目實戰
  • 百度百科