JMS

JMS即Java消息服務(wù)(Java Message Service)應(yīng)用程序接口,是一個Java平臺中關(guān)于面向消息中間件(MOM)的API,用于在兩個應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進行異步通信。Java消息服務(wù)指的是兩個應(yīng)用程序之間進行異步通信的API,它為標準消息協(xié)議和消息服務(wù)提供了一組通用接口,包括創(chuàng)建、發(fā)送、讀取消息等,用于支持JAVA應(yīng)用程序開發(fā)。在J2EE中,當兩個應(yīng)用程序使用JMS進行通信時,它們之間并不是直接相連的,而是通過一個共同的消息收發(fā)服務(wù)連接起來,可以達到解耦的效果。

JMS的好處:解耦,異步(接收者不需要在線),可靠(JMS保證消息只會遞送一次。大家都遇到過重復(fù)創(chuàng)建消息問題,而JMS能幫你避免該問題。)


Anenterprise messaging system(EMS) or messaging system in brief[1]is a set of published enterprise-wide standards that allows organizations to send semantically precise messages between computer systems. EMS systems promoteloosely coupledarchitectures that allow changes in the formats of messages to have minimum impact on message subscribers. EMS systems are facilitated by the use of structured messages (such as usingXMLorJSON), and appropriate protocols, such asDDS,MSMQ,AMQPorSOAPwithweb services.

JMS編程接口

JMS應(yīng)用程序由如下基本模塊組成:

管理對象(Administered objects)-連接工廠(Connection Factories)和目的地(Destination)

連接對象(Connections)

會話(Sessions)

消息生產(chǎn)者(Message Producers)

消息消費者(Message Consumers)

消息監(jiān)聽者(Message Listeners)

JMS管理對象

管理對象(Administered objects)是預(yù)先配置的JMS對象,由系統(tǒng)管理員為使用JMS的客戶端創(chuàng)建,主要有兩個被管理的對象:

連接工廠(ConnectionFactory)

目的地(Destination)

這兩個管理對象由JMS系統(tǒng)管理員通過使用Application Server管理控制臺創(chuàng)建,存儲在應(yīng)用程序服務(wù)器的JNDI名字空間或JNDI注冊表。

連接工廠(ConnectionFactory)

客戶端使用一個連接工廠對象連接到JMS服務(wù)提供者,它創(chuàng)建了JMS服務(wù)提供者和客戶端之間的連接。JMS客戶端(如發(fā)送者或接受者)會在JNDI名字空間中搜索并獲取該連接。使用該連接,客戶端能夠與目的地通訊,往隊列或話題發(fā)送/接收消息。讓我們用一個例子來理解如何發(fā)送消息:

QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");

Queue purchaseQueue= (Queue) initialCtx.lookup ("Purchase_Queue");

Queue returnQueue= (Queue) initialCtx.lookup ("Return_Queue");

目的地(Destination)

目的地指明消息被發(fā)送的目的地以及客戶端接收消息的來源。JMS使用兩種目的地,隊列和話題。如下代碼指定了一個隊列和話題。

創(chuàng)建一個隊列Session

QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);//get the Queue objectQueue t = (Queue) ctx.lookup ("myQueue");//create QueueReceiverQueueReceiver receiver = ses.createReceiver(t);

創(chuàng)建一個話題Session

TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE);//get the Topic objectTopic t = (Topic) ctx.lookup ("myTopic");//create TopicSubscriberTopicSubscriber receiver = ses.createSubscriber(t);

JMS連接

連接對象封裝了與JMS提供者之間的虛擬連接,如果我們有一個ConnectionFactory對象,可以使用它來創(chuàng)建一個連接。

Connection connection = connectionFactory.createConnection();

創(chuàng)建完連接后,需要在程序使用結(jié)束后關(guān)閉它:

connection.close();

JMS?會話(Session)

Session是一個單線程上下文,用于生產(chǎn)和消費消息,可以創(chuàng)建出消息生產(chǎn)者和消息消費者。

Session對象實現(xiàn)了Session接口,在創(chuàng)建完連接后,我們可以使用它創(chuàng)建Session。

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

JMS消息生產(chǎn)者

消息生產(chǎn)者由Session創(chuàng)建,用于往目的地發(fā)送消息。生產(chǎn)者實現(xiàn)MessageProducer接口,我們可以為目的地、隊列或話題創(chuàng)建生產(chǎn)者;

···

MessageProducer producer =session.createProducer(dest);

MessageProducer producer=session.createProducer(queue);

MessageProducer producer= session.createProducer(topic);

···

創(chuàng)建完消息生產(chǎn)者后,可以使用send方法發(fā)送消息:

producer.send(message);

JMS消息消費者

消息消費者由Session創(chuàng)建,用于接受目的地發(fā)送的消息。消費者實現(xiàn)MessageConsumer接口,,我們可以為目的地、隊列或話題創(chuàng)建消費者;

MessageConsumer consumer =session.createConsumer(dest);

MessageConsumer consumer=session.createConsumer(queue);

MessageConsumer consumer= session.createConsumer(topic);

JMS消息監(jiān)聽器

JMS消息監(jiān)聽器是消息的默認事件處理者,他實現(xiàn)了MessageListener接口,該接口包含一個onMessage方法,在該方法中需要定義消息達到后的具體動作。通過調(diào)用setMessageListener方法我們給指定消費者定義了消息監(jiān)聽器

Listener myListener =newListener();

consumer.setMessageListener(myListener);

JMS消息結(jié)構(gòu)

JMS客戶端使用JMS消息與系統(tǒng)通訊,JMS消息雖然格式簡單但是非常靈活, JMS消息由三部分組成:

消息頭

JMS消息頭預(yù)定義了若干字段用于客戶端與JMS提供者之間識別和發(fā)送消息,預(yù)編譯頭如下:

– JMSDestination

– JMSDeliveryMode

– JMSMessageID

– JMSTimestamp

– JMSCorrelationID

– JMSReplyTo

– JMSRedelivered

– JMSType

– JMSExpiration

– JMSPriority

消息屬性

我們可以給消息設(shè)置自定義屬性,這些屬性主要是提供給應(yīng)用程序的。對于實現(xiàn)消息過濾功能,消息屬性非常有用,JMS API定義了一些標準屬性,JMS服務(wù)提供者可以選擇性的提供部分標準屬性。

消息體

在消息體中,JMS API定義了五種類型的消息格式,讓我們可以以不同的形式發(fā)送和接受消息,并提供了對已有消息格式的兼容。不同的消息類型如下:

Text message: javax.jms.TextMessage,表示一個文本對象。

Object message: javax.jms.ObjectMessage,表示一個JAVA對象。

Bytes message: javax.jms.BytesMessage,表示字節(jié)數(shù)據(jù)。

Stream message:javax.jms.StreamMessage,表示java原始值數(shù)據(jù)流。

Map message: javax.jms.MapMessage,表示鍵值對。


WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——允許服務(wù)器主動發(fā)送信息給客戶端。




http://www.itdecent.cn/p/a26fe64505a3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ActiveMQ 即時通訊服務(wù) 淺析http://www.cnblogs.com/hoojo/p/active_m...
    bboymonk閱讀 1,583評論 0 11
  • 什么是Java消息服務(wù) Java消息服務(wù)指的是兩個應(yīng)用程序之間進行異步通信的API,它為標準消息協(xié)議和消息服務(wù)提供...
    雨帶著眼淚滑落閱讀 1,001評論 1 4
  • 什么是JMS Java消息服務(wù)(Java Message Service,簡稱JMS)是用于訪問企業(yè)消息系統(tǒng)的開發(fā)...
    zach_undefined閱讀 4,159評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • 說到消息中間件,不得不提一下 JMS。JMS是java消息服務(wù)(Java Message Service)應(yīng)...
    北你妹的風(fēng)閱讀 811評論 0 3

友情鏈接更多精彩內(nèi)容