摘要:多個(gè)發(fā)布者將消息發(fā)送到系統(tǒng)將這些消息傳遞給多個(gè)訂閱者。發(fā)送消息目的地目的地指明消息被發(fā)送的目的地以及客戶(hù)端接收消息的來(lái)源。消息生產(chǎn)者消息生產(chǎn)者由創(chuàng)建,用于往目的地發(fā)送消息。
簡(jiǎn)介:
JMS(JAVA Message Service,java消息服務(wù))API是一個(gè)消息服務(wù)的標(biāo)準(zhǔn)或者說(shuō)是規(guī)范,允許應(yīng)用程序組件基于JavaEE平臺(tái)創(chuàng)建、發(fā)送、接收和讀取消息。它使分布式通信耦合度更低,消息服務(wù)更加可靠以及異步性。
基本概念:
JMS是java的消息服務(wù),JMS的客戶(hù)端之間可以通過(guò)JMS服務(wù)進(jìn)行異步的消息傳輸。JMS保證消息只會(huì)遞送一次。大家都遇到過(guò)重復(fù)創(chuàng)建消息問(wèn)題,而JMS能幫你避免該問(wèn)題。
消息模型:
Point-to-Point(P2P)
Publish/Subscribe(Pub/Sub)
即點(diǎn)對(duì)點(diǎn)和發(fā)布訂閱模型
P2P模式
每個(gè)消息都被發(fā)送到一個(gè)特定的隊(duì)列,接收者從隊(duì)列中獲取消息。隊(duì)列保留著消息,直到他們被消費(fèi)或超時(shí)。
特點(diǎn)是:
1.每個(gè)消息只有一個(gè)消費(fèi)者(Consumer)(即一旦被消費(fèi),消息就不再在消息隊(duì)列中)。
2.發(fā)送者和接收者之間在時(shí)間上沒(méi)有依賴(lài)性,也就是說(shuō)當(dāng)發(fā)送者發(fā)送了消息之后,不管接收者有沒(méi)有正在運(yùn)行,它不會(huì)影響到消息被發(fā)送到隊(duì)列。
3.接收者在成功接收消息之后需向隊(duì)列應(yīng)答成功。
Pub/Sub模式
客戶(hù)端將消息發(fā)送到主題。多個(gè)發(fā)布者將消息發(fā)送到Topic,系統(tǒng)將這些消息傳遞給多個(gè)訂閱者。
特點(diǎn)是:
1.每個(gè)消息可以有多個(gè)消費(fèi)者。
2.發(fā)布者和訂閱者之間有時(shí)間上的依賴(lài)性。針對(duì)某個(gè)主題(Topic)的訂閱者,它必須創(chuàng)建一個(gè)訂閱者之后,才能消費(fèi)發(fā)布者的消息,而且為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。
3.為了緩和這樣嚴(yán)格的時(shí)間相關(guān)性,JMS允許訂閱者創(chuàng)建一個(gè)可持久化的訂閱。這樣,即使訂閱者沒(méi)有被激活(運(yùn)行),它也能接收到發(fā)布者的消息。
消息的消費(fèi)
在JMS中,消息的產(chǎn)生和消費(fèi)是異步的。對(duì)于消費(fèi)來(lái)說(shuō),JMS的消息者可以通過(guò)兩種方式來(lái)消費(fèi)消息。
同步:接收者調(diào)用receive方法來(lái)接收消息,receive方法在能夠接收到消息之前(或超時(shí)之前)將一直阻塞
異步:接收者可以注冊(cè)為一個(gè)消息監(jiān)聽(tīng)器。當(dāng)消息到達(dá)之后,系統(tǒng)自動(dòng)調(diào)用監(jiān)聽(tīng)器的onMessage方法。
JMS編程接口
1.管理對(duì)象(Administered objects)-連接工廠(Connection Factories)和目的地(Destination)
2.連接對(duì)象(Connections)
3.會(huì)話(Sessions)
4.消息生產(chǎn)者(Message Producers)
5.消息消費(fèi)者(Message Consumers)
6.消息監(jiān)聽(tīng)者(Message Listeners)
JMS管理對(duì)象
管理對(duì)象(Administered objects)是預(yù)先配置的JMS對(duì)象,由系統(tǒng)管理員為使用JMS的客戶(hù)端創(chuàng)建,主要有兩個(gè)被管理的對(duì)象:
連接工廠(ConnectionFactory),目的地(Destination)。
這兩個(gè)管理對(duì)象由JMS系統(tǒng)管理員通過(guò)使用Application Server管理控制臺(tái)創(chuàng)建,存儲(chǔ)在應(yīng)用程序服務(wù)器的JNDI名字空間或JNDI注冊(cè)表。
連接工廠(ConnectionFactory)
客戶(hù)端使用一個(gè)連接工廠對(duì)象連接到JMS服務(wù)提供者,它創(chuàng)建了JMS服務(wù)提供者和客戶(hù)端之間的連接。JMS客戶(hù)端(如發(fā)送者或接受者)會(huì)在JNDI名字空間中搜索并獲取該連接。使用該連接,客戶(hù)端能夠與目的地通訊,往隊(duì)列或話題發(fā)送/接收消息。
發(fā)送消息:
QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF"); Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue"); Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");
目的地(Destination)
目的地指明消息被發(fā)送的目的地以及客戶(hù)端接收消息的來(lái)源。
創(chuàng)建一個(gè)隊(duì)列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);
創(chuàng)建一個(gè)話題Session:
TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // get the Topic object Topic t = (Topic) ctx.lookup ("myTopic"); TopicSubscriber receiver = ses.createSubscriber(t);
JMS連接
連接對(duì)象封裝了與JMS提供者之間的虛擬連接,如果我們有一個(gè)ConnectionFactory對(duì)象,可以使用它來(lái)創(chuàng)建一個(gè)連接。
Connection connection = connectionFactory.createConnection();
JMS 會(huì)話(Session)
Session是一個(gè)單線程上下文,用于生產(chǎn)和消費(fèi)消息,可以創(chuàng)建出消息生產(chǎn)者和消息消費(fèi)者。
Session對(duì)象實(shí)現(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)者實(shí)現(xiàn)MessageProducer接口,我們可以為目的地、隊(duì)列或話題創(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消息消費(fèi)者
消息消費(fèi)者由Session創(chuàng)建,用于接受目的地發(fā)送的消息。消費(fèi)者實(shí)現(xiàn)MessageConsumer接口,,我們可以為目的地、隊(duì)列或話題創(chuàng)建消費(fèi)者;
MessageConsumer consumer = session.createConsumer(dest); MessageConsumer consumer = session.createConsumer(queue); MessageConsumer consumer = session.createConsumer(topic);
JMS消息監(jiān)聽(tīng)器
JMS消息監(jiān)聽(tīng)器是消息的默認(rèn)事件處理者,他實(shí)現(xiàn)了MessageListener接口,該接口包含一個(gè)onMessage方法,在該方法中需要定義消息達(dá)到后的具體動(dòng)作。通過(guò)調(diào)用setMessageListener方法我們給指定消費(fèi)者定義了消息監(jiān)聽(tīng)器。
Listener myListener = new Listener(); consumer.setMessageListener(myListener);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66485.html
摘要:對(duì)于與而言,則可以看做是消息傳遞技術(shù)的一種衍生或封裝。在生產(chǎn)者通知消費(fèi)者時(shí),傳遞的往往是消息或事件,而非生產(chǎn)者自身。通過(guò)消息路由,我們可以配置路由規(guī)則指定消息傳遞的路徑,以及指定具體的消費(fèi)者消費(fèi)對(duì)應(yīng)的生產(chǎn)者。采用和來(lái)進(jìn)行遠(yuǎn)程對(duì)象的通訊。 消息模式 歸根結(jié)底,企業(yè)應(yīng)用系統(tǒng)就是對(duì)數(shù)據(jù)的處理,而對(duì)于一個(gè)擁有多個(gè)子系統(tǒng)的企業(yè)應(yīng)用系統(tǒng)而言,它的基礎(chǔ)支撐無(wú)疑就是對(duì)消息的處理。與對(duì)象不同,消息本質(zhì)上...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問(wèn)題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問(wèn)題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。這個(gè)時(shí)候,可以啟動(dòng)多臺(tái)積分系統(tǒng),來(lái)同時(shí)消費(fèi)這個(gè)消息中間件里面的登錄消息,達(dá)到橫向擴(kuò)展的作用。 時(shí)間:2017年07月22日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無(wú)學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...
摘要:而中的消息中間件則是在常見(jiàn)的消息中間件類(lèi)型無(wú)疑是不錯(cuò)的選擇。是在之間傳遞的消息的對(duì)象。基本功能是用于和面向消息的中間件相互通信的應(yīng)用程序接口。支持兩種消息發(fā)送和接收模型。一種稱(chēng)為模型,即采用點(diǎn)對(duì)點(diǎn)的方式發(fā)送消息。 消息中間件利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成。通過(guò)提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn)程間的通信。而Ja...
閱讀 2669·2023-04-25 15:22
閱讀 2839·2021-10-11 10:58
閱讀 1061·2021-08-30 09:48
閱讀 1866·2019-08-30 15:56
閱讀 1740·2019-08-30 15:53
閱讀 1107·2019-08-29 11:16
閱讀 1060·2019-08-23 18:34
閱讀 1652·2019-08-23 18:12