Java音訊隊列--JMS概述。本站提示廣大學習愛好者:(Java音訊隊列--JMS概述)文章只能為提供參考,不一定能成為您想要的結果。以下是Java音訊隊列--JMS概述正文
JMS即Java音訊服務(Java Message Service)使用順序接口,是一個Java平台中關於面向音訊兩頭件(MOM)的API,用於在兩個使用順序之間,或散布式零碎中發送音訊,停止異步通訊。Java音訊服務是一個與詳細平台有關的API,絕大少數MOM提供商都對JMS提供支持(百度百科給出的概述)。我們可以復雜的了解:兩個使用順序之間需求停止通訊,我們運用一個JMS服務,停止兩頭的轉發,經過JMS 的運用,我們可以解除兩個順序之間的耦合。
2、JMS的優勢
JMS is asynchronous by default. So to receive a message, the client is not required to send the request. The message will arrive automatically to the client as they become available.(JMS 本來就是一個異步的音訊服務,客戶端獲取音訊的時分,不需求自動發送懇求,音訊會自動發送給可用的客戶端)
JMS provides the facility of assurance that the message will delivered once and only once. You know that duplicate messages create problems. JMS helps you avoiding such problems.(JMS保證音訊只會遞送一次。大家都遇到過反復創立音訊問題,而JMS能幫你防止該問題。)
3、JMS的音訊模型
JMS具有兩種通訊形式:
1、Point-to-Point Messaging Domain (點對點)
2、Publish/Subscribe Messaging Domain (發布/訂閱形式)
在JMS API呈現之前,大局部產品運用“點對點”和“發布/訂閱”中的任一方式來停止音訊通訊。JMS定義了這兩種音訊發送模型的標准,它們互相獨立。任何JMS的提供者可以完成其中的一種或兩種模型,這是它們自己的選擇。JMS標准提供了通用接口保證我們基於JMS API編寫的順序適用於任何一種模型。
(1)、Point-to-Point Messaging Domain(點對點通訊模型)
a、形式圖:
b、觸及到的概念:
在點對點通訊形式中,使用順序由音訊隊列,發送方,接納方組成。每個音訊都被發送到一個特定的隊列,接納者從隊列中獲取音訊。隊列保存著音訊,直到他們被消費或超時。
c、特點:
(2)、Publish/Subscribe Messaging Domain(發布/訂閱通訊模型)
a、形式圖:
b、觸及到的概念:
在發布/訂閱音訊模型中,發布者發布一個音訊,該音訊經過topic傳遞給一切的客戶端。該形式下,發布者與訂閱者都是匿名的,即發布者與訂閱者都不知道對方是誰。並且可以靜態的發布與訂閱Topic。Topic次要用於保管和傳遞音訊,且會不斷保管音訊直到音訊被傳遞給客戶端。
c、特點:
4、JMS接納音訊
在JMS中,音訊的發生和音訊是異步的。關於消費來說,JMS的音訊者可以經過兩種方式來消費音訊。
(1)、同步(Synchronous)
在同步消費信息形式形式中,訂閱者/接納方經過調用 receive()辦法來接納音訊。在receive()辦法中,線程會阻塞直到音訊抵達或許到指定時間後音訊仍未抵達。
(2)、異步(Asynchronous)
運用異步方式接納音訊的話,音訊訂閱者需注冊一個音訊監聽者,相似於事情監聽器,只需音訊抵達,JMS服務提供者會經過調用監聽器的onMessage()遞送音訊。
5、JMS編程模型
(1)、Connection Factories
創立Connection對象的工廠,針對兩種不同的jms音訊模型,辨別有QueueConnectionFactory和TopicConnectionFactory兩種。可以經過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");
(2)、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);
創立一個Topic 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);
(3)、Connection
Connection表示在客戶端和JMS零碎之間樹立的鏈接(對TCP/IP socket的包裝)。Connection可以發生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩品種型:QueueConnection和TopicConnection。
銜接對象封裝了與JMS提供者之間的虛擬銜接,假如我們有一個ConnectionFactory對象,可以運用它來創立一個銜接。
Connection connection = connectionFactory.createConnection();
(4)、Session
Session 是我們抵消息停止操作的接口,可以經過session創立消費者、消費者、音訊等。Session 提供了事務的功用,假如需求運用session發送/接納多個音訊時,可以將這些發送/接納舉措放到一個事務中。
我們可以在銜接創立完成之後創立session:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
這外面提供了參數兩個參數,第一個參數是能否支持事務,第二個是事務的類型
(5)、Producter
音訊消費者由Session創立,用於往目的地發送音訊。消費者完成MessageProducer接口,我們可以為目的地、隊列或話題創立消費者;
MessageProducer producer = session.createProducer(dest); MessageProducer producer = session.createProducer(queue); MessageProducer producer = session.createProducer(topic);
(6)、Consumer
音訊消費者由Session創立,用於接納被發送到Destination的音訊。
MessageConsumer consumer = session.createConsumer(dest); MessageConsumer consumer = session.createConsumer(queue); MessageConsumer consumer = session.createConsumer(topic);
(7)、MessageListener
音訊監聽器。假如注冊了音訊監聽器,一旦音訊抵達,將自動調用監聽器的onMessage辦法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。