<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [JMS(Java消息服務)入門教程](http://www.cnblogs.com/chenpi/p/5559349.html) [TOC=1,3] # 閱讀目錄 * [什么是Java消息服務 ](http://www.cnblogs.com/chenpi/p/5559349.html#_label0) * [為什么需要JMS](http://www.cnblogs.com/chenpi/p/5559349.html#_label1) * [JMS的優勢](http://www.cnblogs.com/chenpi/p/5559349.html#_label2) * [JMS消息傳送模型](http://www.cnblogs.com/chenpi/p/5559349.html#_label3) * [接收消息](http://www.cnblogs.com/chenpi/p/5559349.html#_label4) * [JMS編程接口](http://www.cnblogs.com/chenpi/p/5559349.html#_label5) * [JMS消息結構](http://www.cnblogs.com/chenpi/p/5559349.html#_label6) * [JMS使用示例](http://www.cnblogs.com/chenpi/p/5559349.html#_label7) * [譯文鏈接(做了部分修改~~)](http://www.cnblogs.com/chenpi/p/5559349.html#_label8) [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # 什么是Java消息服務    Java消息服務指的是兩個應用程序之間進行異步通信的API,它為標準消息協議和消息服務提供了一組通用接口,包括創建、發送、讀取消息等,用于支持JAVA應用程序開發。在J2EE中,當兩個應用程序使用JMS進行通信時,它們之間并不是直接相連的,而是通過一個共同的消息收發服務連接起來,可以達到解耦的效果,我們將會在接下來的教程中詳細介紹。 [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # 為什么需要JMS   在JAVA中,如果兩個應用程序之間對各自都不了解,甚至這兩個程序可能部署在不同的大洲上,那么它們之間如何發送消息呢?舉個例子,一個應用程序A部署在印度,另一個應用程序部署在美國,然后每當A觸發某件事后,B想從A獲取一些更新信息。當然,也有可能不止一個B對A的更新信息感興趣,可能會有N個類似B的應用程序想從A中獲取更新的信息。   在這種情況下,JAVA提供了最佳的解決方案-JMS,完美解決了上面討論的問題。   JMS同樣適用于基于事件的應用程序,如聊天服務,它需要一種發布事件機制向所有與服務器連接的客戶端發送消息。JMS與RMI不同,發送消息的時候,接收者不需要在線。服務器發送了消息,然后就不管了;等到客戶端上線的時候,能保證接收到服務器發送的消息。這是一個很強大的解決方案,能處理當今世界很多普遍問題。 [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # JMS的優勢 ## 異步   JMS天生就是異步的,客戶端獲取消息的時候,不需要主動發送請求,消息會自動發送給可用的客戶端。 ## 可靠   JMS保證消息只會遞送一次。大家都遇到過重復創建消息問題,而JMS能幫你避免該問題。 [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # JMS消息傳送模型   在JMS API出現之前,大部分產品使用“點對點”和“發布/訂閱”中的任一方式來進行消息通訊。JMS定義了這兩種消息發送模型的規范,它們相互獨立。任何JMS的提供者可以實現其中的一種或兩種模型,這是它們自己的選擇。JMS規范提供了通用接口保證我們基于JMS API編寫的程序適用于任何一種模型。   讓我們更加詳細的看下這兩種消息傳送模型: ## 點對點消息傳送模型   在點對點消息傳送模型中,應用程序由消息隊列,發送者,接收者組成。每一個消息發送給一個特殊的消息隊列,該隊列保存了所有發送給它的消息(除了被接收者消費掉的和過期的消息)。點對點消息模型有一些特性,如下: * 每個消息只有一個接收者; * 消息發送者和接收者并沒有時間依賴性; * 當消息發送者發送消息的時候,無論接收者程序在不在運行,都能獲取到消息; * 當接收者收到消息的時候,會發送確認收到通知(acknowledgement)。 ![](http://images2015.cnblogs.com/blog/879896/201606/879896-20160604194640227-215496499.gif) ## 發布/訂閱消息傳遞模型   在發布/訂閱消息模型中,發布者發布一個消息,該消息通過topic傳遞給所有的客戶端。在這種模型中,發布者和訂閱者彼此不知道對方,是匿名的且可以動態發布和訂閱topic。topic主要用于保存和傳遞消息,且會一直保存消息直到消息被傳遞給客戶端。 發布/訂閱消息模型特性如下: * 一個消息可以傳遞給多個訂閱者 * 發布者和訂閱者有時間依賴性,只有當客戶端創建訂閱后才能接受消息,且訂閱者需一直保持活動狀態以接收消息。 * 為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。 ![](http://images2015.cnblogs.com/blog/879896/201606/879896-20160604232610055-1944763982.gif) [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # 接收消息   在JMS中,消息的接收可以使用以下兩種方式: ## 同步   使用同步方式接收消息的話,消息訂閱者調用receive()方法。在receive()中,消息未到達或在到達指定時間之前,方法會阻塞,直到消息可用。 ## 異步   使用異步方式接收消息的話,消息訂閱者需注冊一個消息監聽者,類似于事件監聽器,只要消息到達,JMS服務提供者會通過調用監聽器的onMessage()遞送消息。 [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # JMS編程接口   JMS應用程序由如下基本模塊組成: 1. 管理對象(Administered objects)-連接工廠(Connection Factories)和目的地(Destination) 2. 連接對象(Connections) 3. 會話(Sessions) 4. 消息生產者(Message Producers) 5. 消息消費者(Message Consumers) 6. 消息監聽者(Message Listeners) ![](http://images2015.cnblogs.com/blog/879896/201606/879896-20160604234140321-1865897064.png) ## JMS管理對象 管理對象(Administered objects)是預先配置的JMS對象,由系統管理員為使用JMS的客戶端創建,主要有兩個被管理的對象: * 連接工廠(ConnectionFactory) * 目的地(Destination) 這兩個管理對象由JMS系統管理員通過使用Application Server管理控制臺創建,存儲在應用程序服務器的JNDI名字空間或JNDI注冊表。 ## 連接工廠(ConnectionFactory) 客戶端使用一個連接工廠對象連接到JMS服務提供者,它創建了JMS服務提供者和客戶端之間的連接。JMS客戶端(如發送者或接受者)會在JNDI名字空間中搜索并獲取該連接。使用該連接,客戶端能夠與目的地通訊,往隊列或話題發送/接收消息。讓我們用一個例子來理解如何發送消息: ~~~ QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF"); Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue"); Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue"); ~~~ ## 目的地(Destination) 目的地指明消息被發送的目的地以及客戶端接收消息的來源。JMS使用兩種目的地,隊列和話題。如下代碼指定了一個隊列和話題。 **創建一個隊列Session** ~~~ 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); ~~~ **創建一個話題Session** ~~~ 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); ~~~ ## JMS連接 連接對象封裝了與JMS提供者之間的虛擬連接,如果我們有一個ConnectionFactory對象,可以使用它來創建一個連接。 ~~~ Connection connection = connectionFactory.createConnection(); ~~~ 創建完連接后,需要在程序使用結束后關閉它: ~~~ connection.close(); ~~~ ## JMS?會話(Session) Session是一個單線程上下文,用于生產和消費消息,可以創建出消息生產者和消息消費者。 Session對象實現了Session接口,在創建完連接后,我們可以使用它創建Session。 ~~~ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ~~~ ## JMS消息生產者 消息生產者由Session創建,用于往目的地發送消息。生產者實現MessageProducer接口,我們可以為目的地、隊列或話題創建生產者; ~~~ MessageProducer producer = session.createProducer(dest); MessageProducer producer = session.createProducer(queue); MessageProducer producer = session.createProducer(topic); ~~~ 創建完消息生產者后,可以使用send方法發送消息: ~~~ producer.send(message); ~~~ ## JMS消息消費者 消息消費者由Session創建,用于接受目的地發送的消息。消費者實現MessageConsumer接口,,我們可以為目的地、隊列或話題創建消費者; ~~~ MessageConsumer consumer = session.createConsumer(dest); MessageConsumer consumer = session.createConsumer(queue); MessageConsumer consumer = session.createConsumer(topic); ~~~ ## JMS消息監聽器 JMS消息監聽器是消息的默認事件處理者,他實現了MessageListener接口,該接口包含一個onMessage方法,在該方法中需要定義消息達到后的具體動作。通過調用setMessageListener方法我們給指定消費者定義了消息監聽器 ~~~ Listener myListener = new Listener(); consumer.setMessageListener(myListener); ~~~ [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # JMS消息結構 JMS客戶端使用JMS消息與系統通訊,JMS消息雖然格式簡單但是非常靈活, JMS消息由三部分組成: ## 消息頭 JMS消息頭預定義了若干字段用于客戶端與JMS提供者之間識別和發送消息,預編譯頭如下: – JMSDestination – JMSDeliveryMode – JMSMessageID – JMSTimestamp – JMSCorrelationID – JMSReplyTo – JMSRedelivered – JMSType – JMSExpiration – JMSPriority ## 消息屬性 我們可以給消息設置自定義屬性,這些屬性主要是提供給應用程序的。對于實現消息過濾功能,消息屬性非常有用,JMS API定義了一些標準屬性,JMS服務提供者可以選擇性的提供部分標準屬性。 ## 消息體 在消息體中,JMS API定義了五種類型的消息格式,讓我們可以以不同的形式發送和接受消息,并提供了對已有消息格式的兼容。不同的消息類型如下: **Text message**?: javax.jms.TextMessage,表示一個文本對象。 **Object message**?: javax.jms.ObjectMessage,表示一個JAVA對象。 **Bytes message**?: javax.jms.BytesMessage,表示字節數據。 **Stream message**?:javax.jms.StreamMessage,表示java原始值數據流。 **Map message**?: javax.jms.MapMessage,表示鍵值對。 最后補充一下,常見的開源JMS服務的提供者,如下: * JBoss 社區所研發的 HornetQ * Joram * Coridan的MantaRay * The OpenJMS Group的OpenJMS [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # JMS使用示例 ## [基于Tomcat + JNDI + ActiveMQ實現JMS的點對點消息傳送](http://www.cnblogs.com/chenpi/p/5565618.html) ## [JMS發布/訂閱消息傳送例子](http://www.cnblogs.com/chenpi/p/5566983.html) [](http://www.cnblogs.com/chenpi/p/5559349.html#_labelTop) # 譯文鏈接(做了部分修改~~) [http://howtodoinjava.com/jms/jms-java-message-service-tutorial/](http://howtodoinjava.com/jms/jms-java-message-service-tutorial/) 以上就是JMS的入門教程,學習愉快~ @Author ?????[風一樣的碼農](http://www.cnblogs.com/chenpi/) @HomePageUrl?[http://www.cnblogs.com/chenpi/](http://www.cnblogs.com/chenpi/)? @Copyright ?????[轉載請注明出處,謝謝~](http://www.cnblogs.com/chenpi/)?
                  <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>

                              哎呀哎呀视频在线观看