摘要:The java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform EnterPRise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.
JMS(JAVA Message Service,java消息服務(wù))API是一個(gè)消息服務(wù)的標(biāo)準(zhǔn)或者說是規(guī)范,允許應(yīng)用程序組件基于JavaEE平臺(tái)創(chuàng)建、發(fā)送、接收和讀取消息。它使分布式通信耦合度更低,消息服務(wù)更加可靠以及異步性。
這篇博文我們主要介紹J2EE中的一個(gè)重要規(guī)范JMS,因?yàn)檫@個(gè)規(guī)范在企業(yè)中的應(yīng)用十分的廣泛,也比較重要,我們主要介紹JMS的基本概念和它的模式,消息的消費(fèi)以及JMS編程步驟。
基本概念
JMS是java的消息服務(wù),JMS的客戶端之間可以通過JMS服務(wù)進(jìn)行異步的消息傳輸。
消息模型
○ Point-to-Point(P2P)○ Publish/Subscribe(Pub/Sub)即點(diǎn)對(duì)點(diǎn)和發(fā)布訂閱模型
P2P
P2P模式圖涉及到的概念 消息隊(duì)列(Queue)發(fā)送者(Sender)接收者(Receiver)每個(gè)消息都被發(fā)送到一個(gè)特定的隊(duì)列,接收者從隊(duì)列中獲取消息。隊(duì)列保留著消息,直到他們被消費(fèi)或超時(shí)。
P2P的特點(diǎn)
每個(gè)消息只有一個(gè)消費(fèi)者(Consumer)(即一旦被消費(fèi),消息就不再在消息隊(duì)列中)發(fā)送者和接收者之間在時(shí)間上沒有依賴性,也就是說當(dāng)發(fā)送者發(fā)送了消息之后,不管接收者有沒有正在運(yùn)行,它不會(huì)影響到消息被發(fā)送到隊(duì)列接收者在成功接收消息之后需向隊(duì)列應(yīng)答成功如果你希望發(fā)送的每個(gè)消息都應(yīng)該被成功處理的話,那么你需要P2P模式。
Pub/Sub
Pub/Sub模式圖涉及到的概念 主題(Topic)發(fā)布者(Publisher)訂閱者(Subscriber) 客戶端將消息發(fā)送到主題。多個(gè)發(fā)布者將消息發(fā)送到Topic,系統(tǒng)將這些消息傳遞給多個(gè)訂閱者。
Pub/Sub的特點(diǎn)
每個(gè)消息可以有多個(gè)消費(fèi)者發(fā)布者和訂閱者之間有時(shí)間上的依賴性。針對(duì)某個(gè)主題(Topic)的訂閱者,它必須創(chuàng)建一個(gè)訂閱者之后,才能消費(fèi)發(fā)布者的消息,而且為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。為了緩和這樣嚴(yán)格的時(shí)間相關(guān)性,JMS允許訂閱者創(chuàng)建一個(gè)可持久化的訂閱。這樣,即使訂閱者沒有被激活(運(yùn)行),它也能接收到發(fā)布者的消息。如果你希望發(fā)送的消息可以不被做任何處理、或者被一個(gè)消息者處理、或者可以被多個(gè)消費(fèi)者處理的話,那么可以采用Pub/Sub模型
消息的消費(fèi) 在JMS中,消息的產(chǎn)生和消息是異步的。對(duì)于消費(fèi)來說,JMS的消息者可以通過兩種方式來消費(fèi)消息。 ○ 同步 訂閱者或接收者調(diào)用receive方法來接收消息,receive方法在能夠接收到消息之前(或超時(shí)之前)將一直阻塞 ○ 異步 訂閱者或接收者可以注冊(cè)為一個(gè)消息監(jiān)聽器。當(dāng)消息到達(dá)之后,系統(tǒng)自動(dòng)調(diào)用監(jiān)聽器的onMessage方法。
JMS編程模型
(1) ConnectionFactory
創(chuàng)建Connection對(duì)象的工廠,針對(duì)兩種不同的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory對(duì)象。
(2) Destination
Destination的意思是消息生產(chǎn)者的消息發(fā)送目標(biāo)或者說消息消費(fèi)者的消息來源。對(duì)于消息生產(chǎn)者來說,它的Destination是某個(gè)隊(duì)列(Queue)或某個(gè)主題(Topic);對(duì)于消息消費(fèi)者來說,它的Destination也是某個(gè)隊(duì)列或主題(即消息來源)。
所以,Destination實(shí)際上就是兩種類型的對(duì)象:Queue、Topic可以通過JNDI來查找Destination。
(3) Connection
Connection表示在客戶端和JMS系統(tǒng)之間建立的鏈接(對(duì)TCP/ip socket的包裝)。Connection可以產(chǎn)生一個(gè)或多個(gè)session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。
(4) Session
Session是我們操作消息的接口。可以通過session創(chuàng)建生產(chǎn)者、消費(fèi)者、消息等。Session提供了事務(wù)的功能。當(dāng)我們需要使用session發(fā)送/接收多個(gè)消息時(shí),可以將這些發(fā)送/接收動(dòng)作放到一個(gè)事務(wù)中。同樣,也分QueueSession和TopicSession。
(5) 消息的生產(chǎn)者
消息生產(chǎn)者由Session創(chuàng)建,并用于將消息發(fā)送到Destination。同樣,消息生產(chǎn)者分兩種類型:QueueSender和TopicPublisher。可以調(diào)用消息生產(chǎn)者的方法(send或publish方法)發(fā)送消息。
(6) 消息消費(fèi)者
消息消費(fèi)者由Session創(chuàng)建,用于接收被發(fā)送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創(chuàng)建。當(dāng)然,也可以session的creatDurableSubscriber方法來創(chuàng)建持久化的訂閱者。
(7) MessageListener
消息監(jiān)聽器。如果注冊(cè)了消息監(jiān)聽器,一旦消息到達(dá),將自動(dòng)調(diào)用監(jiān)聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
企業(yè)消息系統(tǒng)的好處
我們先來看看下圖,應(yīng)用程序A將Message發(fā)送到服務(wù)器上,然后應(yīng)用程序B從服務(wù)器中接收A發(fā)來的消息,通過這個(gè)圖我們一起來分析一下JMS的好處:
提供消息靈活性松散耦合異步性對(duì)于JMS的基本概念我們就介紹這么多,下篇博文介紹一種JMS的實(shí)現(xiàn)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注