<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # JMS 教程 – Java 消息服務教程 > 原文: [https://howtodoinjava.com/jms/jms-java-message-service-tutorial/](https://howtodoinjava.com/jms/jms-java-message-service-tutorial/) [Java 消息服務](https://en.wikipedia.org/wiki/Java_Message_Service)是一種 API,支持網絡上計算機之間稱為**消息傳遞的正式通信**。 它為標準消息協議和消息服務提供了通用接口,以支持 Java 程序。 它提供了創建,發送和閱讀消息的功能。 JMS API 減少了程序員必須學習使用消息傳遞服務/產品的概念,并且還提供了支持消息傳遞應用的功能。 **JMS** 是一種技術,在 J2EE 技術??中用于使應用以松散耦合的方式與其他應用通信。 這意味著必須通信的應用沒有直接連接,而是通過一個公共目標連接。 我們將在本 **jms 教程**中詳細介紹。 ```java Table of Contents 1\. Need of JMS 2\. Benefits of JMS 3\. Messaging Domains 4\. Message Consumption 5\. JMS participating objects 6\. JMS Message Components ``` ## 1\. JMS 教程 - JMS 的必要性 在 Java 中,如果一個人想要以一種方式將消息從一個應用發送到另一個應用,使得這兩個應用彼此之間一無所知,那么即使它們可以完全不依賴地部署在單獨的大陸上。 例如,一個應用 A 在印度運行,另一個應用在美國運行,而 B 則有興趣從 A 獲得一些更新/消息 - 每當 A 上發生獨特的事情。可能有 N 個這樣的應用對 來自 A 的此類更新。 在這種情況下,java 提供了 JMS 形式的最佳解決方案 - 解決了上面討論的完全相同的問題。 當我們編寫任何基于事件的應用(例如聊天服務器)時,JMS 也是有用的,在該應用中,它需要一種發布事件機制來在服務器之間向與服務器連接的客戶端之間發送消息。 由于 JMS 與 RMI 不同,因此在將消息從客戶端發送到服務器時,不需要使目標對象聯機可用。 服務器發布消息并忘記它,每當客戶端聯機時,它將獲取消息。 它是當今世界上非常常見的問題的強大解決方案。 ## 2\. JMS 教程 - JMS 的好處 1. #### 異步 默認情況下,JMS 是異步的。 因此,要接收消息,不需要客戶端發送請求。 消息將在可用時自動到達客戶端。 2. #### 可靠 JMS 提供了保證消息將只傳遞一次的功能。 您知道重復的消息會造成問題。 JMS 幫助您避免此類問題。 ## 3\. JMS 消息傳遞域 在 JMS API 出現之前,大多數消息傳遞產品都支持**點對點**或**發布/訂閱**消息傳遞方法。 JMS 為每種方法提供一個單獨的域,并定義每個域的合規性。 任何 JMS 提供商都可以實現這兩個域或一個域,這是他自己的選擇。 JMS 提供了公共接口,使我們能夠使用 JMS API,而不是特定于任何一個域。 讓我們更詳細地了解兩種消息傳遞域,以了解 **JMS 的工作原理**。 #### 3.1 點對點消息傳遞域 在點對點消息傳遞域中,該應用是基于消息隊列,發送者和接收者構建的。 每個消息都尋址到特定的[**隊列**](https://docs.oracle.com/javaee/6/api/javax/jms/Queue.html)。 隊列保留發送給他們的所有消息,直到消息被消耗或過期。 PTP 消息傳遞具有一些特征: 1. 每個消息只有一個客戶端。 2. 消息的發送者和接收者沒有時間依賴項。 3. 當發送方發送消息時,接收方可以獲取消息是否正在運行。 4. 接收者在收到消息后發送確認。 ![Point to point JMS Messaging](https://img.kancloud.cn/75/46/7546d00ef5bc984e08adee27896a2b3d_575x135.png) 點對點 JMS 消息傳遞 #### 3.2 發布/訂閱消息域 在發布/訂閱消息傳遞域中,僅發布一條消息,該消息通過充當公告板的[**主題**](https://docs.oracle.com/javaee/6/api/javax/jms/Topic.html)傳遞給所有客戶端。 發布者和訂閱者通常是匿名的,可以動態發布或訂閱主題。 主題負責保存和傳遞消息。 只要分發到當前客戶端,該主題就會保留消息。 一些特征是: 1. 一條消息可以有多個訂閱者。 2. 發布者和訂閱具有時間依賴項。 訂閱主題的客戶端只能使用在客戶端創建訂閱后發布的消息,并且訂閱者必須繼續處于活動狀態才能使用消息。 ![Publish Subscribe JMS Messaging](https://img.kancloud.cn/2c/ef/2cefa960a95893c306d683274379ca19_402x164.png) 發布訂閱 JMS 消息傳遞 閱讀更多:[HornetQ 基本示例](//howtodoinjava.com/hornetq/basic-jms-messaging-example-using-hornetq-stand-alone-server/) ## 4.消息使用 在 JMS 中,可以通過兩種方式使用消息: #### 4.1 同步 在同步消息使用中,訂閱者/接收者通過調用[`receive()`](https://docs.oracle.com/javaee/7/api/javax/jms/MessageConsumer.html#receive--)方法從目標請求消息。 在`receive()`中,方法將阻塞直到消息到達或超時(如果消息在給定時間內未到達)。 就像普通的 java 方法調用一樣,它帶有一些返回值。 #### 4.2 異步 在異步消息消費中,訂閱者可以向消費者注冊(或訂閱)為消息監聽器。 消息監聽器與事件監聽器相同,每當消息到達目標時,JMS 提供者都會通過調用監聽器的[`onMessage()`](https://docs.oracle.com/javaee/7/api/javax/jms/MessageListener.html#onMessage-javax.jms.Message-)方法來傳遞消息,該方法將對消息的內容起作用。 ## 5\. JMS 參與對象 JMS 應用具有一些基本構建塊,它們是: 1. 受管對象 – 連接工廠和目標 2. 連接 3. 會話 4. 消息生產者 5. 消息消費者 6. 消息監聽器 ![JMS API Programming Model](https://img.kancloud.cn/75/94/7594d08aac066225d24fd3ff17089b3f_699x513.png) JMS API 編程模型 #### 5.1 JMS 管理對象 JMS 應用提供兩種類型的管理對象: * 連接工廠 * 目標 這兩個受管理對象由 JMS 系統管理員在 JMS 生產者中通過使用應用服務管理控制臺創建。 這兩個對象都存儲在應用服務器 JNDI 目錄或 JNDI 注冊表中。 #### 5.2 連接工廠 客戶端使用的對象是[連接工廠](https://docs.oracle.com/javaee/6/api/javax/jms/ConnectionFactory.html),用于創建與供應器的連接。 它在 JMS 生產者和 JMS 客戶端之間創建連接。 當諸如發送者或接收者之類的 JMS 客戶端在 JNDI 注冊表中搜索該對象時,則 JMS 客戶端會收到一個連接對象,這不僅僅是 JMS 生產者和 JMS 客戶端之間的物理連接。 使用此連接,客戶端可以與目標對象進行通信,以將消息發送或接收到隊列或主題中。 讓我們舉一個例子來理解它發送消息: ```java QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF"); Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue"); Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue"); ``` #### 5.3 目標 客戶端使用稱為目標的對象,該對象用于指定其生成的消息的目標以及使用它的消息的源。 JMS 應用使用兩種類型的目標隊列或主題。 該代碼指定隊列和主題。 **創建隊列會話** ```java QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); //get the Queue object Queue t = (Queue) ctx.lookup ("myQueue"); //create QueueReceiver QueueReceiver receiver = ses.createReceiver(t); ``` **創建主題會話** ```java TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // get the Topic object Topic t = (Topic) ctx.lookup ("myTopic"); //create TopicSubscriber TopicSubscriber receiver = ses.createSubscriber(t); ``` #### 5.4 JMS 連接 該連接封裝了與 JMS 供應器的虛擬連接。 該連接實現了`Connection`接口,當它具有`ConnectionFactory`對象時,我們可以使用它來創建連接。 ```java Connection connection = connectionFactory.createConnection(); ``` 創建任何連接后,應在使用以下方法完成應用之前關閉它們: ```java connection.close(); ``` #### 5.5 JMS 會話 [會話](https://docs.oracle.com/javaee/7/api/javax/jms/Session.html)是用于生成和使用消息的單線程上下文。 這些會話用于創建以下內容: * 消息生產者 * 消息消費者 會話實現了`Session`接口,并且在創建`Connection`對象之后,我們使用它來創建`Session`。 ```java Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ``` #### 5.6 JMS 消息生產者 消息生產者是由會話創建的對象,用于將消息發送到目標。 這實現了[`MessageProducer`](https://docs.oracle.com/javaee/7/api/javax/jms/MessageProducer.html)接口。 我們使用`Session`為目標,隊列或主題對象創建一個`MessageProducer`。 ```java MessageProducer producer = session.createProducer(dest); MessageProducer producer = session.createProducer(queue); MessageProducer producer = session.createProducer(topic); ``` 創建消息后,將使用生成器來使用`send`方法發送消息。 ```java producer.send(message); ``` #### 5.7 JMS 消息使用者 消息使用者是一個由會話創建的對象,用于接收在目標發送的消息。 它將實現[`MessageConsumer`](https://docs.oracle.com/javaee/7/api/javax/jms/MessageConsumer.html)接口。 我們使用會話為目標,隊列或主題對象創建`MessageConsumer`。 ```java MessageConsumer consumer = session.createConsumer(dest); MessageConsumer consumer = session.createConsumer(queue); MessageConsumer consumer = session.createConsumer(topic); ``` #### 5.8 JMS 消息監聽器 消息監聽器是一個對象,充當消息的異步事件處理器。 消息監聽器實現[`MessageListener`](https://docs.oracle.com/javaee/7/api/javax/jms/MessageListener.html)接口,其中包含一個方法`onMessage()`。 在這種方法中,我們定義了消息到達時要執行的動作。 通過使用`setMessageListener()`,我們使用特定的`MessageConsumer`定義消息監聽器。 ```java Listener myListener = new Listener(); consumer.setMessageListener(myListener); ``` ## 6\. JMS 消息組件 JMS 客戶端使用 JMS 消息在系統之間進行通信。 JMS 消息具有簡單的格式,但具有高度的靈活性,它允許創建與格式匹配的消息。 JMS 消息分為三個部分。 他們是: 1. #### 消息標題 JMS 消息頭包含許多預定義字段,這些字段包含客戶機和提供者用來標識和發送消息的那些值。 預定義的標頭是: - `JMSDestination` - `JMSDeliveryMode` - `JMSMessageID` - `JMSTimestamp` - `JMSCorrelationID` - `JMSReplyTo` - `JMSRelivered` - `JMSType` - `JMSExpiration` 2. #### 消息屬性 在消息屬性中,我們可以創建和設置消息的屬性。 消息屬性是由應用設置或讀取的自定義名稱值對。 消息屬性對于支持過濾消息很有用。 JMS API 提供了供應器可以支持的一些預定義屬性。 消息屬性是可選的。 3. #### 消息正文 在消息正文中,JMS API 定義了五種消息正文格式,也稱為消息類型,它們使我們能夠以許多不同的形式發送和接收數據,并提供與現有消息傳遞格式的兼容性。 它基本上由從 JMS 發送方發送到接收方的實際消息組成。 不同的消息類型是: **文本消息**:由`javax.jms.TextMessage`表示。 它用于表示文本塊。 **對象消息**:由`javax.jms.ObjectMessage`表示。 它用來表示一個 Java 對象。 **字節消息**:由`javax.jms.BytesMessage`表示。 它用來表示二進制數據。 **流消息**:由`javax.jms.StreamMessage`表示。 它用于表示 Java 基本值的列表。 **映射消息**:由`javax.jms.MapMessage`表示。 它用于表示一組關鍵字或值對。 **JMS 入門教程**及其相關術語就這些了。 在下一組帖子中。 我將舉一些 JMS 的例子。 學習愉快! 參考文獻: [JSR 914:JavaTM 消息服務(JMS)API](https://www.jcp.org/en/jsr/detail?id=914) [JMS 參考](https://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看