1. JMS基本概念
JMS(Java Message Service) 即Java消息服務(wù)。它提供標(biāo)準(zhǔn)的產(chǎn)生、發(fā)送、接收消息的接口簡(jiǎn)化
企業(yè)應(yīng)用的開(kāi)發(fā)。它支持兩種消息通信模型:點(diǎn)到點(diǎn)(point-to-point)(P2P)模型和發(fā)布/訂閱(Pub/Sub)模型。P2P 模型規(guī)定了一個(gè)消息只能有一個(gè)接收者;Pub/Sub 模型允許一個(gè)消息可以有多個(gè)接收者。
對(duì)于點(diǎn)到點(diǎn)模型,消息生產(chǎn)者產(chǎn)生一個(gè)消息后,把這個(gè)消息發(fā)送到一個(gè)Queue(隊(duì)列)中,然后消息接收者再?gòu)倪@個(gè)Queue中讀取,一旦這個(gè)消息被一個(gè)接收者讀取之后,它就在這個(gè)Queue中消失了,所以一個(gè)消息只能被一個(gè)接收者消費(fèi)。
與點(diǎn)到點(diǎn)模型不同,發(fā)布/訂閱模型中,消息生產(chǎn)者產(chǎn)生一個(gè)消息后,把這個(gè)消息發(fā)送到一個(gè)Topic中,這個(gè)Topic可以同時(shí)有多個(gè)接收者在監(jiān)聽(tīng),當(dāng)一個(gè)消息到達(dá)這個(gè)Topic之后,所有消息接收者都會(huì)收到這個(gè)消息。
簡(jiǎn)單的講,點(diǎn)到點(diǎn)模型和發(fā)布/訂閱模型的區(qū)別就是前者是一對(duì)一,后者是一對(duì)多。 |
2. 幾個(gè)重要概念
Destination:消息發(fā)送的目的地,也就是前面說(shuō)的Queue和Topic。創(chuàng)建好一個(gè)消息之后,只需要把這個(gè)消息發(fā)送到目的地,消息的發(fā)送者就可以繼續(xù)做自己的事情,而不用等待消息被處理完成。至于這個(gè)消息什么時(shí)候,會(huì)被哪個(gè)消費(fèi)者消費(fèi),完全取決于消息的接受者。
Message:從字面上就可以看出是被發(fā)送的消息。它有下面幾種類(lèi)型:
StreamMessage:Java 數(shù)據(jù)流消息,用標(biāo)準(zhǔn)流操作來(lái)順序的填充和讀取。
MapMessage:一個(gè)Map類(lèi)型的消息;名稱(chēng)為 string 類(lèi)型,而值為 Java 的基本類(lèi)型。
TextMessage:普通字符串消息,包含一個(gè)String。
ObjectMessage:對(duì)象消息,包含一個(gè)可序列化的Java 對(duì)象
BytesMessage:二進(jìn)制數(shù)組消息,包含一個(gè)byte[]。
XMLMessage: 一個(gè)XML類(lèi)型的消息。
最常用的是TextMessage和ObjectMessage。
Session:與JMS提供者所建立的會(huì)話,通過(guò)Session我們才可以創(chuàng)建一個(gè)Message。
Connection:與JMS提供者建立的一個(gè)連接。可以從這個(gè)連接創(chuàng)建一個(gè)會(huì)話,即Session。
ConnectionFactory:那如何創(chuàng)建一個(gè)Connection呢?這就需要下面講到的ConnectionFactory了。通過(guò)這個(gè)工廠類(lèi)就可以得到一個(gè)與JMS提供者的連接,即Conection。
Producer:消息的生產(chǎn)者,要發(fā)送一個(gè)消息,必須通過(guò)這個(gè)生產(chǎn)者來(lái)發(fā)送。
MessageConsumer:與生產(chǎn)者相對(duì)應(yīng),這是消息的消費(fèi)者或接收者,通過(guò)它來(lái)接收一個(gè)消息。
前面多次提到JMS提供者,因?yàn)镴MS給我們提供的只是一系列接口,當(dāng)我們使用一個(gè)JMS的時(shí)候,還是需要一個(gè)第三方的提供者,它的作用就是真正
管理這些Connection,Session,Topic和Queue等。
通過(guò)下面這個(gè)簡(jiǎn)圖可以看出上面這些概念的關(guān)系。
ConnectionFactory---->Connection--->Session--->Message
Destination + Session------------------------------------>Producer
Destination + Session------------------------------------>MessageConsumer
那么可能有人會(huì)問(wèn): ConnectionFactory和Destination 從哪兒得到?
這就和JMS提供者有關(guān)了. 如果在一個(gè)JavaEE環(huán)境中, 可以通過(guò)JNDI查找得到, 如果在一個(gè)非JavaEE環(huán)境中, 那只能通過(guò)JMS提供者提供給我們的接口得到了.