圖一
activeMQ現(xiàn)在越來越復(fù)雜了,就像一個(gè)武林高手,會(huì)的套路是越來越多了,想要看清他的路數(shù),有點(diǎn)不容易。但是如果能把住他的“脈”也許就看清楚了。activeMQ做為軟件也有它的“脈象”,也就是我們經(jīng)常所說的領(lǐng)域模型。
領(lǐng)域模型尤其是象activeMQ這樣的中等規(guī)模的軟件系統(tǒng),也都是在對問題域不斷深入認(rèn)識的過程中,一次次進(jìn)化的。我們這次來分析activeMQ的領(lǐng)域模型,也是本著這樣的態(tài)度,這篇文章是1.0版,隨著我們之后的不斷認(rèn)識,該領(lǐng)域模型的分析也會(huì)不斷深入。
在正式分析前,我要申明一下,圖中所出現(xiàn)的類之間的關(guān)系,我們希望達(dá)到“神似”,并且我們也只是選擇了最為重要的一部分領(lǐng)域類。
首先介紹該模型中每個(gè)領(lǐng)域類的作用,然后再介紹它們之間的關(guān)系。
Broker:activeMQ的一個(gè)整體代表
RegionBroker:負(fù)責(zé)分發(fā)broker的操作到相應(yīng)的消息區(qū)域
Region:activeMQ目前有四種主要消息區(qū)域:隊(duì)列域(queueRegion)、主題域(topicRegion)、臨時(shí)隊(duì)列域(tempQueueRegion)、臨時(shí)主題域(tempTopicRegion)
TransportConnection:代表一個(gè)通訊連接
Destination:消息的目的地,主要包括兩種Queue、Topic兩種
Subscription:消息的消費(fèi)者、訂閱者
MessageStore:消息持久化存儲(chǔ),象比較復(fù)雜的Kaha存儲(chǔ)機(jī)制就放在這
PendingMessageCursor:等待發(fā)給消費(fèi)者的消息分發(fā)指針
ConnectionContext:用來維護(hù)發(fā)送請求所需的連接上下文
下面我們把這些領(lǐng)域類的關(guān)系進(jìn)行一個(gè)描述:
1、一個(gè)RegionBroker擁有4種消息域的對象。
2、RegionBroker擁有所有目的地對象(destination)。
3、每個(gè)消息域(Region)也擁有它們對應(yīng)的0或N個(gè)目的地對象(destination)。
4、同時(shí)每個(gè)Region也擁有它們對應(yīng)的0或N個(gè)消息消費(fèi)者、訂閱者(subscription)。
5、每個(gè)目的地都有一個(gè)相應(yīng)的持久化存儲(chǔ)方式(messageStore),以及一個(gè)等待發(fā)送的消息分發(fā)指針(pendingMessageCursor)。
6、消息消費(fèi)者和目的地可以彼此擁有0或N個(gè)。
7、每個(gè)消費(fèi)者都有一個(gè)對應(yīng)的ConnectionContext,ConnectionContext里包括一個(gè)TransportConnection對象,通過TransportConnection把真實(shí)的消息發(fā)給消費(fèi)者。
8、TransportConnection也可以做為通訊連接,偵聽消息生產(chǎn)者發(fā)出的信息,所以每個(gè)TransportConnection會(huì)指向Broker對象。
上面的關(guān)系描述是靜態(tài)的,不便于理解,就像人的筋脈一樣,所以下面我們通過消息在activeMQ里的流動(dòng)過程,來打通activeMQ的“七筋八脈”。
圖二
消費(fèi)生產(chǎn)者進(jìn)程向activeMQ所在進(jìn)程發(fā)送消息和消費(fèi)者消費(fèi)消息的過程如上圖所示,消息傳遞的路徑經(jīng)過了核心領(lǐng)域模型,具體步驟如下:
步驟1:生產(chǎn)者通過向activeMQ為它建立好的TransportConnection發(fā)送消息給activeMQ。
步驟2:TransportConnection對象找到RegionBroker。
步驟3:RegionBroker根據(jù)消息的類型找到對應(yīng)的消息區(qū)域(Region)。
步驟4:該Region在它自己里面找到相應(yīng)的消息目的地。
步驟5、6:該目的地首先根據(jù)需要進(jìn)行持久化操作,并使用待發(fā)送消息指針對象。
步驟7:當(dāng)有合適的消息消費(fèi)者、訂閱者來到時(shí),目的地會(huì)找到這些消費(fèi)者。
步驟8、9:通過該消費(fèi)者對應(yīng)的TransportConnection,消息從activeMQ中出來,發(fā)給相應(yīng)的消費(fèi)者進(jìn)程。