1. 程式人生 > >JMS:java訊息服務學習入門

JMS:java訊息服務學習入門

什麼是Java訊息服務 

  Java訊息服務指的是兩個應用程式之間進行非同步通訊的API,它為標準訊息協議和訊息服務提供了一組通用介面,包括建立、傳送、讀取訊息等,用於支援JAVA應用程式開發。在J2EE中,當兩個應用程式使用JMS進行通訊時,它們之間並不是直接相連的,而是通過一個共同的訊息收發服務連線起來,可以達到解耦的效果,我們將會在接下來的教程中詳細介紹。

為什麼需要JMS

  在JAVA中,如果兩個應用程式之間對各自都不瞭解,甚至這兩個程式可能部署在不同的大洲上,那麼它們之間如何傳送訊息呢?舉個例子,一個應用程式A部署在印度,另一個應用程式部署在美國,然後每當A觸發某件事後,B想從A獲取一些更新資訊。當然,也有可能不止一個B對A的更新資訊感興趣,可能會有N個類似B的應用程式想從A中獲取更新的資訊。

  在這種情況下,JAVA提供了最佳的解決方案-JMS,完美解決了上面討論的問題。

  JMS同樣適用於基於事件的應用程式,如聊天服務,它需要一種釋出事件機制向所有與伺服器連線的客戶端傳送訊息。JMS與RMI不同,傳送訊息的時候,接收者不需要線上。伺服器傳送了訊息,然後就不管了;等到客戶端上線的時候,能保證接收到伺服器傳送的訊息。這是一個很強大的解決方案,能處理當今世界很多普遍問題。

JMS的優勢

非同步

  JMS天生就是非同步的,客戶端獲取訊息的時候,不需要主動傳送請求,訊息會自動傳送給可用的客戶端。

可靠

  JMS保證訊息只會遞送一次。大家都遇到過重複建立訊息問題,而JMS能幫你避免該問題。

JMS訊息傳送模型

  在JMS API出現之前,大部分產品使用“點對點”和“釋出/訂閱”中的任一方式來進行訊息通訊。JMS定義了這兩種訊息傳送模型的規範,它們相互獨立。任何JMS的提供者可以實現其中的一種或兩種模型,這是它們自己的選擇。JMS規範提供了通用介面保證我們基於JMS API編寫的程式適用於任何一種模型。

  讓我們更加詳細的看下這兩種訊息傳送模型:

點對點訊息傳送模型

  在點對點訊息傳送模型中,應用程式由訊息佇列,傳送者,接收者組成。每一個訊息傳送給一個特殊的訊息佇列,該佇列儲存了所有傳送給它的訊息(除了被接收者消費掉的和過期的訊息)。點對點訊息模型有一些特性,如下:

  • 每個訊息只有一個接收者;
  • 訊息傳送者和接收者並沒有時間依賴性;
  • 當訊息傳送者傳送訊息的時候,無論接收者程式在不在執行,都能獲取到訊息;
  • 當接收者收到訊息的時候,會發送確認收到通知(acknowledgement)。

釋出/訂閱訊息傳遞模型

  在釋出/訂閱訊息模型中,釋出者釋出一個訊息,該訊息通過topic傳遞給所有的客戶端。在這種模型中,釋出者和訂閱者彼此不知道對方,是匿名的且可以動態釋出和訂閱topic。topic主要用於儲存和傳遞訊息,且會一直儲存訊息直到訊息被傳遞給客戶端。

釋出/訂閱訊息模型特性如下:

  • 一個訊息可以傳遞給多個訂閱者
  • 釋出者和訂閱者有時間依賴性,只有當客戶端建立訂閱後才能接受訊息,且訂閱者需一直保持活動狀態以接收訊息。
  • 為了緩和這樣嚴格的時間相關性,JMS允許訂閱者建立一個可持久化的訂閱。這樣,即使訂閱者沒有被啟用(執行),它也能接收到釋出者的訊息。

接收訊息

  在JMS中,訊息的接收可以使用以下兩種方式:

同步

  使用同步方式接收訊息的話,訊息訂閱者呼叫receive()方法。在receive()中,訊息未到達或在到達指定時間之前,方法會阻塞,直到訊息可用。

非同步

  使用非同步方式接收訊息的話,訊息訂閱者需註冊一個訊息監聽者,類似於事件監聽器,只要訊息到達,JMS服務提供者會通過呼叫監聽器的onMessage()遞送訊息。

JMS程式設計介面

  JMS應用程式由如下基本模組組成:

  1. 管理物件(Administered objects)-連線工廠(Connection Factories)和目的地(Destination)
  2. 連線物件(Connections)
  3. 會話(Sessions)
  4. 訊息生產者(Message Producers)
  5. 訊息消費者(Message Consumers)
  6. 訊息監聽者(Message Listeners)

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

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

JMS使用示例

譯文連結(做了部分修改~~)

相關推薦

JMSjava訊息服務學習入門

什麼是Java訊息服務    Java訊息服務指的是兩個應用程式之間進行非同步通訊的API,它為標準訊息協議和訊息服務提供了一組通用介面,包括建立、傳送、讀取訊息等,用於支援JAVA應用程式開發。在J2EE中,當兩個應用程式使用JMS進行通訊時,它們之間並不是直接相連的

JMS(java訊息服務)學習筆記

    JMS(java訊息服務)是java平臺關於面向訊息中介軟體的api介面,用於在應用程式和分散式系統中傳送訊息,進行非同步通訊。JMS提供了一套類似JDBC的技術規範,服務的實現由具體的實現提供商提供。     使用JMS,可以解決諸多的體系結構性問題,比如異構系統

JMSjava訊息服務學習

什麼是Java訊息服務   Java訊息服務指的是兩個應用程式之間進行非同步通訊的API,它為標準訊息協議和訊息服務提供了一組通用介面,包括建立、傳送、讀取訊息等,用於支援JAVA應用程式開發。在J2EE中,當兩個應用程式使用JMS進行通訊時,它們之間並不是直接相連的,而是通

JMS-ActiveMQ:Java訊息服務

導讀: JMS:Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通.本文接受了JMS的基礎知識,業務需求以及功能實現等。    

JMS(Java訊息服務)入門教程

閱讀目錄 什麼是Java訊息服務    Java訊息服務指的是兩個應用程式之間進行非同步通訊的API,它為標準訊息協議和訊息服務提供了一組通用介面,包括建立、傳送、讀取訊息等,用於支援JAVA應用程式開發。在J2EE中,當兩個應用程式使用JMS進行通訊時,它們之間

Java訊息服務JMS詳解

JMS:      Java訊息服務(Java Message Service) JMS是用於訪問企業訊息系統的開發商中立的API。企業訊息系統可以協助應用軟體通過網路進行訊息互動。   JMS的程式設計過程很簡單,概括為:

JAVA訊息服務JMS規範及原理詳解

一、簡介JMS即Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API,用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。Java訊息服務是一個與具體平臺無關的API,絕大多數MOM提

JMS : Java Message Service (Java訊息服務

1 引言 1.1 編寫目的 本文作為B2bi專案中開源產品JORAM的使用指導文件,旨在幫助專案組人員方便明瞭的進行JMS模組的詳細設計和開發工作。本文件主要包含建設銀行EAI平臺B2Bi子系統中使用的開源JMS產品——JORAM的使用說明 1.2 名詞解釋 B2Bi:

8年開發java程式設計師教你JAVA開發應該學習什麼?讓你不迷茫

java入門學習有哪些內容?很多想學習java的學生都不知道怎麼學java,特別是沒有基礎的學生,今天8年開發的老程式設計師,給大家整理了一下,java入門學習有哪些內容: 第一階段 計算機基本原理,Java語言發展簡史,Java開發環境的搭建,體驗Java程式的開發,Java語法格式

服務學習入門——(一)

架構演變 專案架構隨著時間的演進,出現了三個:單體架構,SOA,微服務。 單體架構:即我們日常學習接觸到的最簡單的,傳統的一種架構方式,在中小型專案裡出現居多。一個歸檔包裡包含了整個專案所有功能的單體應用,通常稱作單體應用,比如個人的小型部落格,打成war包就可以直接上傳到伺服器裡進行釋出。

Seneca NodeJS 微服務框架入門指南

Seneca 是一個能讓您快速構建基於訊息的微服務系統的工具集,你不需要知道各種服務本身被部署在何處,不需要知道具體有多少服務存在,也不需要知道他們具體做什麼,任何你業務邏輯之外的服務(如資料庫、快取或者第三方整合等)都被隱藏在微服務之後。 這種解耦使您的系統易於連續構

Java併發指南開篇Java併發程式設計學習大綱

Java併發程式設計一直是Java程式設計師必須懂但又是很難懂的技術內容。 這裡不僅僅是指使用簡單的多執行緒程式設計,或者使用juc的某個類。當然這些都是併發程式設計的基本知識,除了使用這些工具以外,Java併發程式設計中涉及到的技術原理十分豐富。為了更好地把併發知識形成一

Java虛擬機器學習入門

1      前言 想深入瞭解Java,虛擬機器是必須掌握的技能,任何一個Java程式都離不開虛擬機器,對於初學者瞭解JVM也可以更好的理解Java的初始化、記憶體使用等知識點。總結了一下自己在學習虛

Java訊息服務(第二版)讀書筆記

   1.訊息傳送機制基礎 近年來,系統的複雜性和先進性增長非常顯著,對於系統的可靠性、可伸縮性和靈活性等的要求要比以前要高。為了適應這種對更好更快的系統日益增長的需求,體系結構師、架構師和開發者已經開始利用訊息傳送機制,作為解決這些複雜問題的一種方式。 儘管近年來JMS API未發生顯著的變化,但

javax.jmsjava訊息機制

JMS(Java Message Service) 即Java訊息服務。 它提供標準的產生、傳送、接收訊息的介面簡化企業 應用的開發。它支援兩種訊息通訊模型: 點到點(point-to-point)(P2P)模型 釋出/訂閱(Pub/Sub)模型 P2

答好友困惑Java零基礎如何入門,不知道怎麼學,迷茫ING

作者:程式設計師小躍 幾個星期之前,我在知乎上看到一個提問,說是:對於完全沒有經驗零基礎自身的數學底子也很弱學習Java應該怎麼學習呢?想著類似的問題我也有過回答,並且反饋還是蠻好的,就參考之前的思路回答了一遍,可惜沒在公眾號裡和大家分享,後續再整理一份好好分享下。(該問答地址見原文) 提出問題的是一位高

JavaSE入門學習24Java面向對象補充

ont 執行 pri img ack ima iss 類的構造函數 條件 一Java中的Object類 Object類是全部Java類的父類。假設一個類沒有使用extendskeyword明白標識繼承另外一個類,那麽這個類默認 繼

JavaSE入門學習23Java面向對象之構造方法

ons 抽象類 什麽 ont 機會 語法 好的 error return 學了JavaSE面向對象這一部分,也該對構造方法做一個總結了。 一構造方法 在多數情況下,初始化一個對象的終於步驟是去調用這個對象的構造方法。構造

入門到精通資深程式設計師規劃JAVA大資料學習路線(附視訊教程)

人類正在從IT時代走向DT(Data Technology)的時代。以網際網路、雲端計算、大資料和人工智慧為代表的技術革命正在滲透至各行各業,改變著我們的生活。 本文主要針對從事大資料開發的程式設計師們整理了整套的大資料學習相關的路線圖和知識材料,希望能幫助到大家。 很多初學者,對大資

Java入門推薦Java程式設計快速高效的入門學習方法

看到有不少的小夥伴詢問快速高效學習Java程式設計的方法有哪些?對Java程式設計感興趣的小夥伴比較在意Java程式設計的學習方法,想要找到好的學習方法快速高效的學習,早日學成高薪就業。小編就和讀者分享一下快速高效學習Java程式設計的方法,希望可以幫到喜歡Java程式設計想要學習的小夥伴們。