專利名稱::實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置和方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,尤其涉及一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置和方法。
背景技術(shù):
:一個(gè)軟件系統(tǒng)通常由多個(gè)功能組件(模塊)組成,每個(gè)組件負(fù)責(zé)特定的任務(wù),各個(gè)不同的組件間通過數(shù)據(jù)交互來協(xié)同工作。在實(shí)際的軟件生產(chǎn)中,軟件生產(chǎn)企業(yè)需要根據(jù)客戶的需要對(duì)軟件進(jìn)行定制,生產(chǎn)出符合客戶需要的功能組件。比如,對(duì)于同一個(gè)軟件,有些客戶需要某項(xiàng)功能,而另一些客戶卻不需要該功能;有些客戶目前不需要某項(xiàng)功能,而將來卻可能有需求該功能。因此,為了降低軟件生產(chǎn)企業(yè)的成本,需要增加軟件的靈活性和擴(kuò)展性,要求一個(gè)軟件的各個(gè)組件間不互相依賴,任何一個(gè)非核心組件的添加/刪除"務(wù)改都不會(huì)影響其它組件的功能。并且各個(gè)組件間可以很方便地實(shí)現(xiàn)動(dòng)態(tài)組合?,F(xiàn)有技術(shù)中第一種組件間進(jìn)行通信的方法為單進(jìn)程中組件間的數(shù)據(jù)交互通過直接接口調(diào)用的方式來實(shí)現(xiàn)。該直接接口調(diào)用的原理示意圖如圖1所示,任意兩個(gè)組件間都預(yù)先定義進(jìn)行互相通信的消息接口和相應(yīng)的方法,當(dāng)一個(gè)組件需要和另一個(gè)組件進(jìn)行數(shù)據(jù)交互的時(shí)候,它就調(diào)用相應(yīng)消息接口的特定方法,通過該特定方法發(fā)送數(shù)據(jù)給對(duì)方、從對(duì)方獲取數(shù)據(jù)或觸發(fā)對(duì)方的一個(gè)行為。在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)上述現(xiàn)有技術(shù)中第一種組件間進(jìn)行通信的方法存在如下的問題1、任意兩個(gè)組件間都必須預(yù)先設(shè)定消息接口,隨著組件的增多,消息接口必將變得多且復(fù)雜,從而導(dǎo)致對(duì)組件進(jìn)行代碼維護(hù)和重用變得非常困難;2、該方法采用的直接接口調(diào)用導(dǎo)致組件間存在代碼級(jí)的依賴關(guān)系,一個(gè)組件的去除會(huì)導(dǎo)致相關(guān)組件連編譯都無法通過,除非對(duì)相關(guān)組件修改代碼;3、由于組件間進(jìn)行互相通信的消息接口和相應(yīng)的方法都是預(yù)先定義的,因此,很難實(shí)現(xiàn)組件間進(jìn)行發(fā)布/訂閱模式的消息傳遞;很難實(shí)現(xiàn)組件間進(jìn)行異步消息傳遞;必須通過編寫代碼才能實(shí)現(xiàn)組件間的消息驅(qū)動(dòng)?,F(xiàn)有技術(shù)中第二種組件間進(jìn)行通信的方法為使用loC(控制反轉(zhuǎn)文)容器來解除直接接口調(diào)用時(shí)在代碼中出現(xiàn)的硬編碼,實(shí)現(xiàn)單進(jìn)程中組件間的消息接口與實(shí)現(xiàn)的分離,從而解除組件間的代碼級(jí)的依賴關(guān)系。在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)上述現(xiàn)有技術(shù)中第二種組件間進(jìn)行通信的方法的缺點(diǎn)為1、該方法雖然解除了組件間代碼級(jí)的依賴關(guān)系,但是隨著組件的增多,消息接口仍然將變得多且復(fù)雜;2、很難實(shí)現(xiàn)組件間進(jìn)行發(fā)布/訂閱模式的消息傳遞;很難實(shí)現(xiàn)組件間進(jìn)行異步消息傳遞;必須通過編寫代碼才能實(shí)現(xiàn)組件間的消息驅(qū)動(dòng)。現(xiàn)有技術(shù)中第三種組件間進(jìn)行通信的方法為通過Socket通訊來實(shí)現(xiàn)組件間的數(shù)據(jù)交互,上述socket通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)^貪求。如基于Socket通訊的JMS(JavaMessageService,Java消息月良務(wù))方案。在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)上述現(xiàn)有技術(shù)中第三種組件間進(jìn)行通信的方法的缺點(diǎn)為1、該方法主要針對(duì)分布式組件間通信,不適合基于單進(jìn)程的組件間通信;2、該方法實(shí)現(xiàn)起來過于復(fù)雜,性能開銷大。
發(fā)明內(nèi)容本發(fā)明實(shí)施例提供了一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置和方法,從而解決了現(xiàn)有軟件系統(tǒng)中組件間進(jìn)行通信的消息接口復(fù)雜、組件間存在代碼級(jí)的依賴關(guān)系的問題。本發(fā)明實(shí)施例是通過以下技術(shù)方案實(shí)現(xiàn)的一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置,包括消息代理,所述消息代理具體包括消息池和消息處理;漠塊,其中,消息池用于保存消息處理模塊傳遞過來的消息;消息處理模塊用于接收組件向消息代理發(fā)送的消息訂閱信息,從消息池中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并將取出的消息發(fā)送給所述發(fā)送消息訂閱信息的組件;接收各個(gè)組件向消息代理發(fā)送的消息并傳遞給消息池。一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的方法,在軟件系統(tǒng)中設(shè)置消息代理,所述方法具體包括所述消息代理接收各個(gè)組件發(fā)送的消息,并將接收到的消息進(jìn)行保存;所述消息代理接收組件發(fā)送的消息訂閱信息,從所述保存的消息中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并將取出的消息發(fā)送給所述發(fā)送消息訂閱信息的組件。由上述本發(fā)明實(shí)施例提供的技術(shù)方案可以看出,本發(fā)明實(shí)施例通過在軟件系統(tǒng)中設(shè)置消息代理,從而解決了現(xiàn)有軟件系統(tǒng)中組件間進(jìn)行通信的消息接口復(fù)雜、組件間存在代碼級(jí)的依賴關(guān)系的問題,實(shí)現(xiàn)了單進(jìn)程中組件間的消息通訊。圖1為現(xiàn)有技術(shù)中組件間進(jìn)行通信的直接接口調(diào)用的原理示意圖;圖2為本發(fā)明實(shí)施例所述輕量級(jí)消息機(jī)制的原理示意圖;圖3為本發(fā)明實(shí)施例所述消息代理的結(jié)構(gòu)示意圖4為本發(fā)明實(shí)施例所述組件向消息代理發(fā)送普通消息的方法的實(shí)現(xiàn)原理示意圖5為本發(fā)明實(shí)施例所述同步訂閱消息的處理方法的實(shí)現(xiàn)原理示意圖;圖6為本發(fā)明實(shí)施例所述同步訂閱消息的處理方法的具體處理流程圖;圖7為本發(fā)明實(shí)施例所述異步訂閱消息的處理方法的實(shí)現(xiàn)原理示意圖;圖8為本發(fā)明實(shí)施例所述異步訂閱消息的處理方法的具體處理流程圖;圖9為本發(fā)明實(shí)施例所述異步訂閱取消消息的處理方法的實(shí)現(xiàn)原理示意具體實(shí)施例方式本發(fā)明實(shí)施例提供了一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置和方法。本發(fā)明實(shí)施例在軟件系統(tǒng)中設(shè)置軟件代理,在內(nèi)存中開辟一塊單獨(dú)區(qū)域作為存放消息的消息池(MessagePool),該消息池也稱為消息中轉(zhuǎn)地,通過消息代理來管理消息池。軟件系統(tǒng)中的各個(gè)組件都與該消息代理進(jìn)行消息交互,消息代理利用上述消息池進(jìn)行消息的接收、復(fù)制、轉(zhuǎn)發(fā)、銷毀等所有生命周期事件。簡(jiǎn)言之,就是使組件間消息的直接交互轉(zhuǎn)變?yōu)橥ㄟ^上述消息代理來交互。本發(fā)明實(shí)施例將上述消息交互機(jī)制稱為輕量級(jí)消息機(jī)制,該輕量級(jí)消息機(jī)制的原理示意圖如圖2所示。上述輕量級(jí)消息機(jī)制將企業(yè)級(jí)分布式系統(tǒng)間的消息機(jī)制縮小,形成一個(gè)單進(jìn)程中組件間的消息機(jī)制。上述輕量級(jí)消息機(jī)制涉及的消息事件主要有以下四個(gè)1、發(fā)送消息事件,用于組件向消息代理發(fā)送需要和其它組件進(jìn)行共享的消息。該發(fā)送消息事件不考慮消息發(fā)送成功的確認(rèn),因此,該消息發(fā)送為同步發(fā)送。2、同步訂閱事件,用于組件向消息代理發(fā)送同步訂閱信息,該同步訂閱信息可以為所訂閱消息的主題,可以通過同步訂閱消息來攜帶。當(dāng)組件向消息代理發(fā)送同步訂閱消息后,消息代理從消息池中取出所述同步訂閱消息所對(duì)應(yīng)的消息,并將取出的消息返回給該組件后,本次同步訂閱消息自動(dòng)失效,本次同步訂閱事件結(jié)束。因此,上述同步訂閱為單次訂閱。3、異步訂閱事件,用于組件向消息代理發(fā)送異步訂閱消息,該異步訂閱信息可以為所訂閱消息的主題,可以通過異步訂閱消息來攜帶。當(dāng)組件向消息代理發(fā)送異步訂閱消息后,消息代理從消息池中取出所述異步訂閱消息所對(duì)應(yīng)的消息,并將取出的消息返回給該組件后,本次異步訂閱消息仍然失效。當(dāng)消息代理再次從消息池中取出所述異步訂閱消息所對(duì)應(yīng)的消息后,需要再次將該消息發(fā)送給所述發(fā)送異步訂閱消息的組件。直到所述發(fā)送異步訂閱消息的組件取消本次異步訂閱消息,本次異步訂閱事件才結(jié)束。因此,上述異步訂閱為持久訂閱。4、取消異步訂閱事件,用于組件向消息代理發(fā)送異步訂閱取消信息,該異步訂閱取消信息可以通過異步訂閱取消消息來攜帶。當(dāng)組件向消息代理發(fā)送異步訂閱取消消息后,該組件以前向消息代理發(fā)送的異步訂閱消息即失效?;谏鲜鲚p量級(jí)消息機(jī)制,本發(fā)明實(shí)施例所述組件間進(jìn)行通信的裝置為消息代理,在消息代理中包括一個(gè)或多個(gè)Carrier(同步消息處理器)和Consumer(異步消息處理器),該Carrier和Consumer作為一種消息處理器,可以完成在組件和消息代理之間傳遞各種信息,包括發(fā)送消息、同步訂閱時(shí)發(fā)送訂閱信息和取回消息、以及異步訂閱時(shí)發(fā)送訂閱信息等功能。上述Carrier還可以完成監(jiān)^L消息池中的消息的功能。在同步訂閱事件中,一個(gè)Carrier對(duì)應(yīng)一個(gè)發(fā)送同步訂閱消息的組件。上述Consumer用于獲得訂閱組件所異步訂閱的消息,并進(jìn)行處理后發(fā)送給訂閱組件。該消息代理的結(jié)構(gòu)示意圖如圖3所示,包括消息池和消息處理模塊。各個(gè)模塊的功能如下消息池用于保存消息處理模塊發(fā)送過來的需要和其它組件進(jìn)行共享的消息,在消息池中需要保存各個(gè)消息的主題和消息之間的對(duì)應(yīng)關(guān)系,一個(gè)主題唯一對(duì)應(yīng)一個(gè)消息。包括消息保存模塊。其中,消息保存模塊用于接收消息處理模塊傳遞過來的各個(gè)組件向消息代理發(fā)送的需要和其它組件進(jìn)行共享的消息,并將接收到的消息進(jìn)行保存,并且保存各個(gè)消息的主題和消息之間的對(duì)應(yīng)關(guān)系。消息處理模塊用于接收組件向消息代理發(fā)送的需要和其它組件進(jìn)行共享消息并傳遞給消息池;接收組件向消息代理發(fā)送的消息訂閱信息,從消息池中取出所述消息訂閱信息所對(duì)應(yīng)的消息并發(fā)送給所述組件。包括消息接收模塊、同步訂閱消息處理模塊和異步訂閱消息處理模塊。其中,消息接收模塊用于接收各個(gè)組件向消息代理發(fā)送的消息,并將接收到的消息傳遞給消息池。其中,同步訂閱消息處理模塊用于接收組件向消息代理發(fā)送的同步訂閱信息,將同步訂閱信息中攜帶的訂閱組件對(duì)應(yīng)的Carrier的信息和所訂閱的主題的對(duì)應(yīng)關(guān)系進(jìn)行保存。從消息池中取出訂閱組件所訂閱的主題對(duì)應(yīng)的消息體。該消息體包含消息內(nèi)容、消息主題等屬性。從消息池中取出所述主題對(duì)應(yīng)的所有Carrier的信息,才艮據(jù)該所有Carrier的信息獲得相應(yīng)的Carrier。通過所述Carrier將所述取出的消息體發(fā)送給對(duì)應(yīng)的訂閱組件。包括同步訂閱信息接收和保存模塊、同步訂閱消息獲取和發(fā)送模塊。上述同步訂閱消息處理模塊中的同步訂閱信息接收和保存模塊用于接收組件通過Carrier向消息代理發(fā)送的同步訂閱信息,將同步訂閱信息中攜帶的訂閱組件對(duì)應(yīng)的Carrier的信息和所訂閱的主題的對(duì)應(yīng)關(guān)系進(jìn)行保存;該同步訂閱信息為單次訂閱信息,消息代理只向組件返回一次該同步訂閱信息所訂閱的消息。在同步訂閱信息接收和保存才莫塊中可以維持一個(gè)synchSubscribePool(同步-訂閱畫池)Hashtable(哈希表)。該synchSubscribePool表用來存放同步訂閱信息,根據(jù)消息處理模塊傳遞過來的同步訂閱信息來建立。在消息代理向組件發(fā)送了一個(gè)同步訂閱信息所對(duì)應(yīng)的消息后,則從該synchSubscribePool表中將該同步訂閱信息刪除。上述同步訂閱信息包括每個(gè)發(fā)送同步訂閱消息的訂閱組件所訂閱的消息的主題和對(duì)應(yīng)的Carrier的信息。由于一個(gè)主題的消息可以被多個(gè)組件同步訂閱,因此每個(gè)主題都對(duì)應(yīng)著一個(gè)向量,該向量中記錄所有訂閱該主題對(duì)應(yīng)的消息的組件所對(duì)應(yīng)的所有Carrier的信息。上述同步訂閱消息處理模塊中的同步訂閱消息獲取和發(fā)送模塊用于根據(jù)同步訂閱信息接收模塊傳遞過來的同步訂閱信息,從消息池中獲取訂閱組件所訂閱的主題對(duì)應(yīng)的消息體。從消息池中取出所述主題對(duì)應(yīng)的所有Carrier的信息,根據(jù)該所有Carrier的信息獲得相應(yīng)的Carrier。將所述消息體對(duì)應(yīng)復(fù)制多份后,通過各個(gè)Carrier將所述取出的消息體發(fā)送給各個(gè)對(duì)應(yīng)的訂閱組件。然后,通知消息池將各個(gè)訂閱組件所對(duì)應(yīng)的Carrier進(jìn)行釋放,將synchSubscribePool表中記錄的各個(gè)訂閱組件所對(duì)應(yīng)的Carrier的信息和主題的對(duì)應(yīng)關(guān)系進(jìn)行刪除。其中,異步訂閱消息處理模塊用于接收各個(gè)組件向消息代理發(fā)送的異步訂閱信息并傳遞給消息池,該異步訂閱信息包括訂閱組件對(duì)應(yīng)的Consumer的信息和所訂閱的主題;從消息池中獲取訂閱組件所異步訂閱的主題對(duì)應(yīng)的消息體。/人消息池中取出所述主題對(duì)應(yīng)的所有Consumer的信息,根據(jù)該所有Consumer的信息獲得相應(yīng)的Consumer,通過各個(gè)Consumer將所述取出的消息體分別發(fā)送給各個(gè)對(duì)應(yīng)的訂閱組件。根據(jù)接收到的異步訂閱取消消息取消所述組件的異步訂閱信息。包括異步訂閱信息接收和保存模塊、異步訂閱消息獲取和發(fā)送模塊和異步訂閱取消信息接收模塊。上述異步訂閱消息處理模塊中的異步訂閱信息接收和保存模塊用于接收組件通過Carrier向消息代理發(fā)送的異步訂閱消息,將異步訂閱消息攜帶的訂閱組件對(duì)應(yīng)的Consumer的信息和所訂閱的主題的對(duì)應(yīng)關(guān)系進(jìn)行保存。該異步訂閱信息為持久訂閱信息,消息代理向組件返回一次或多次該同步訂閱4言息所訂閱的消息。在異步訂閱信息處理模塊中可以根據(jù)消息處理模塊傳遞過來的異步訂閱信息來建立和維持asynchPublishPool(異步-發(fā)布-池)、asynchSubscribePool(異步-訂閱-池)2個(gè)Hashtable(哈希表)。上述asynchPublishPool表中包括每個(gè)發(fā)送異步訂閱消息的訂閱組件和一個(gè)Consumer的信息的對(duì)應(yīng)關(guān)系。一個(gè)組件可以同時(shí)異步訂閱多種不同主題的消息,因此該組件可能同時(shí)收到多個(gè)異步訂閱的消息,為了保證該組件對(duì)應(yīng)的Consumer能夠按照消息到來的順序依次處理這些消息,每個(gè)Consumer都對(duì)應(yīng)一個(gè)向量,在該向量中記錄處理所有該組件異步訂閱的主題的先后順序。asynchSubscribePool表用來存放異步訂閱信息,該異步訂閱信息包括每個(gè)發(fā)送異步訂閱消息的訂閱組件所訂閱的消息的主題和對(duì)應(yīng)的Consumer的信息。由于一個(gè)主題的消息可以被多個(gè)組件異步訂閱,因此每個(gè)主題都對(duì)應(yīng)著一個(gè)向量,該向量中記錄所有訂閱該主題消息的組件所對(duì)應(yīng)的Consumer的信息。上述異步訂閱消息處理模塊中的異步訂閱消息獲取和發(fā)送模塊用于根據(jù)異步訂閱信息接收模塊傳遞過來的異步訂閱消息,從消息池中獲取訂閱組件所異步訂閱的主題對(duì)應(yīng)的消息體。從消息池中取出所述主題對(duì)應(yīng)的所有Consumer的信息,根據(jù)該所有Consumer的信息獲得相應(yīng)的Consumer,將所述消息體對(duì)應(yīng)復(fù)制多份后,通過各個(gè)Consumer將所述取出的消息體分別發(fā)送給各個(gè)對(duì)應(yīng)的訂閱組件。當(dāng)消息池中再次出現(xiàn)訂閱組件所訂閱的主題對(duì)應(yīng)的消息體時(shí),再次取出該消息體并發(fā)送給對(duì)應(yīng)的訂閱組件。上述異步訂閱消息處理模塊中的異步訂閱取消信息接收模塊用于接收組件通過Carrier向消息代理發(fā)送的異步訂閱取消消息,將異步訂閱取消消息攜帶的訂閱組件對(duì)應(yīng)的Consumer的信息和所訂閱的主題傳遞給消息池。然后,通知消息池中的訂閱信息管理模塊將AsynchPublishPool表中記錄的訂閱組件和Consumer的信息對(duì)應(yīng)關(guān)系進(jìn)4亍刪除,將asynchSubscribePool表中記錄的主題和Consumer的信息對(duì)應(yīng)關(guān)系進(jìn)行刪除。上述消息處理模塊中保存的同步訂閱信息和異步訂閱信息還可以保存于消息池中,或者,在消息代理中通過單獨(dú)的模塊來保存。本發(fā)明實(shí)施例提供了組件向消息代理發(fā)送消息的處理流程、組件向消息代理發(fā)送同步訂閱信息的處理流程、組件向消息代理發(fā)送異步訂閱信息的處理流程和組件向消息代理發(fā)送異步訂閱取消信息的處理流程。本發(fā)明實(shí)施例所述組件向消息代理發(fā)送消息的方法的實(shí)現(xiàn)原理示意圖如圖4所示,具體處理過程如下當(dāng)一個(gè)組件要向消息代理發(fā)送消息時(shí),該組件首先需要?jiǎng)?chuàng)建一個(gè)主題,并封裝該主題對(duì)應(yīng)的消息體。同時(shí)該組件需要聯(lián)系消息代理,從消息代理那里獲得一個(gè)Carrier。然后,該組件將所述封裝的消息體發(fā)送給所述Carrier,由所述Carrier再將所述消息體發(fā)送給消息代理。在實(shí)際應(yīng)用中,組件還可以通過組件和消息代理之間的接口向消息代理發(fā)送消息。組件通過向消息代理發(fā)送同步訂閱信息或異步訂閱信息來獲取消息池中保存的消息,本發(fā)明實(shí)施例所述組件向消息代理發(fā)送同步訂閱信息的實(shí)現(xiàn)原理示意圖如圖5所示,具體處理流程如圖6所示,包括如下步驟步驟61、組件通過Carrier向消息代理發(fā)送主題。當(dāng)一個(gè)組件要向消息代理發(fā)送同步訂閱信息時(shí),該組件首先需要?jiǎng)?chuàng)建一個(gè)需要訂閱的消息的主題。同時(shí)該組件需要聯(lián)系消息代理,從消息代理那里獲得一個(gè)Carrier。該組件將所述主題發(fā)送給所述Carrier,由所述Carrier再將所述主題和所述Carrier的信息發(fā)送給消息代理。步驟62、消息代理將接收到的主題和Carrier的信息的對(duì)應(yīng)關(guān)系進(jìn)行關(guān)聯(lián)保存。消息代理在接收到所述組件通過所述其對(duì)應(yīng)的Carrier發(fā)送過來的主題和Carrier的信息后,需要將主題和Carrier的信息的對(duì)應(yīng)關(guān)系進(jìn)行關(guān)聯(lián)保存。消息代理首先判斷消息池中的synchSubscribePool表中是否已經(jīng)有該主題的訂閱記錄,如果有,則在該主題對(duì)應(yīng)的向量中添加所述組件對(duì)應(yīng)的Carrier信息;如果沒有,則在synchSubscribePool表中添加所述主題和所述Carrier的信息之間的對(duì)應(yīng)關(guān)系的記錄,并生成所述主題對(duì)應(yīng)的向量,該向量中記錄所有訂閱該主題對(duì)應(yīng)的消息的組件所對(duì)應(yīng)的所有Carrier的信息。步驟63、消息代理通過Carrier將組件所訂閱的消息發(fā)送給組件。當(dāng)消息代理將組件對(duì)應(yīng)的Carrier的信息和所訂閱的主題進(jìn)行關(guān)聯(lián)保存后,該Carrier就需要監(jiān)視消息池中保存的消息信息,當(dāng)消息池中已經(jīng)保存了所述組件所訂閱的主題對(duì)應(yīng)的消息體時(shí),所述Carrier才艮據(jù)synchSubscribePool表來確定該主題對(duì)應(yīng)的消息體的所有同步訂閱者,從所述主題對(duì)應(yīng)的向量中獲得該主題對(duì)應(yīng)的消息體的所有Carrier的信息,根據(jù)該所有Carrier的信息獲得相應(yīng)的Carrier,通過Carrier從消息池中獲取訂閱組件所訂閱的主題對(duì)應(yīng)的消息體。并將所述消息體復(fù)制對(duì)應(yīng)多份后遞交給各個(gè)Carrier。然后,由各個(gè)Carrier將接收到的消息體分別發(fā)送給各個(gè)訂閱組件。在同步訂閱中,一個(gè)Carrier同時(shí)只能負(fù)責(zé)一個(gè)訂閱任務(wù),該Carrier不僅要傳送訂閱信息,還要等待消息到來,因此,一個(gè)組件相當(dāng)于對(duì)應(yīng)著一個(gè)Carrier。在實(shí)際應(yīng)用中,還可以在消息池中增加一個(gè)表synchPublishPool,該synchPublishPool用來存放同步訂閱的消息,另外,在消息代理中再設(shè)置一個(gè)或多個(gè)消息分發(fā)者,該消息分發(fā)者用于分發(fā)同步訂閱的消息。于是,組件只需要通過Carrier將消息體的信息放入synchPublishPool表中即可,在消息分發(fā)時(shí),由消息分發(fā)者才艮據(jù)synchPublishPool表和synchSubscribePool來確定主題和Carrier之間的對(duì)應(yīng)關(guān)系,并將所述主題對(duì)應(yīng)的消息體復(fù)制對(duì)應(yīng)多份后遞交纟會(huì)各個(gè)Carrier。之后,消息代理將發(fā)送所述主題的各個(gè)訂閱組件所對(duì)應(yīng)的Carrier進(jìn)行釋放,將synchSubscribePool表中記錄的各個(gè)訂閱組件所對(duì)應(yīng)的Carrier的信息和主題的對(duì)應(yīng)關(guān)系進(jìn)行刪除。本發(fā)明實(shí)施例所述組件向消息代理發(fā)送異步訂閱信息的實(shí)現(xiàn)原理示意圖如圖7所示,具體處理流程如圖8所示,包括如下步驟步驟81、組件通過Carrier向消息代理發(fā)送主題和Consumer的信息。當(dāng)一個(gè)組件要向消息代理發(fā)送異步訂閱消息時(shí),該組件首先需要?jiǎng)?chuàng)建一個(gè)需要訂閱的消息的主題,指定取回所訂閱消息的Consumer。同時(shí)該組件需要聯(lián)系消息代理,從消息代理那里獲得一個(gè)Carrier。然后,該組件將所述主題和Consumer的信息發(fā)送給所述Carrier,由所述Carrier再將所述主題和Consumer的信息發(fā)送給消息代理。步驟82、消息代理將接收到的主題和Consumer的信息、Consumer的信息和組件的對(duì)應(yīng)關(guān)系進(jìn)行關(guān)i[關(guān)保存。消息代理在接收到所述組件通過其對(duì)應(yīng)的Carrier發(fā)送過來的主題和Consumer的信息后,需要將主題和Consumer的信息、Consumer的信息和組件的對(duì)應(yīng)關(guān)系進(jìn)行關(guān)聯(lián)保存。消息代理首先判斷消息池中的asynchSubscribePool表中是否已經(jīng)有該主題的訂閱記錄,如果有,則在該主題對(duì)應(yīng)的向量中添加所述組件對(duì)應(yīng)的Consumed言息;i口果5殳有,貝'J在asynchSubscribePool表中添力口戶斤述主題和所述Consumer的信息之間的對(duì)應(yīng)關(guān)系的記錄,并生成所述主題對(duì)應(yīng)的向量。該向量中記錄所有訂閱該主題對(duì)應(yīng)的消息的組件所對(duì)應(yīng)的Consumer。消息代理還需要判斷消息池中的asynchPublishPool表中是否已經(jīng)有所述Consumer的信息的訂閱記錄,如果有,則在該Consumer對(duì)應(yīng)的向量中添加所述主題信息;如果沒有,則在asynchPublishPool表中添加所述Consumer的信息和訂閱組件之間的對(duì)應(yīng)關(guān)系的記錄,并生成所述Consumer對(duì)應(yīng)的向量,在該向量中記錄處理所有該組件異步訂閱的主題的先后順序。在異步訂閱中,一個(gè)Carrier可以同時(shí)負(fù)責(zé)多個(gè)訂閱任務(wù),該Carrier只負(fù)責(zé)傳送訂閱信息,不必等待消息到來,因此,一個(gè)組件相當(dāng)于對(duì)應(yīng)著一個(gè)Co門sum6「。步驟83、消息代理通過Consumer將組件所訂閱的消息發(fā)送給組件。當(dāng)消息代理將上述主題和Consumer的信息、Consumer的信息和組件的對(duì)應(yīng)關(guān)系進(jìn)行關(guān)聯(lián)保存后,該組件可以繼續(xù)去處理其他的事情,并且該組件只十應(yīng)的CarrierY更^皮釋iU卓。然后,消息代理啟動(dòng)一個(gè)消息發(fā)行器來監(jiān)控asynchPublishPool表中對(duì)應(yīng)的Consumer項(xiàng),該消息發(fā)行器監(jiān)控消息池中是否有asynchSubscribePool表中所述Consumer項(xiàng)對(duì)應(yīng)的主題對(duì)應(yīng)的消息體,如果有,則從所述主題對(duì)應(yīng)的向量中獲得該主題對(duì)應(yīng)的消息體的所有Consumer的信息,根據(jù)該所有Gonsumer^;^f言,l:^^尋^+一目^^^Gonsumer。之后,所述消息發(fā)行器便將所述消息體復(fù)制對(duì)應(yīng)多份后遞交給各個(gè)Consumer,由各個(gè)Consumer將接收到的消息體分別發(fā)送給各個(gè)訂閱組件。當(dāng)所述消息發(fā)行器監(jiān)控到消息池中再次出現(xiàn)所述主題對(duì)應(yīng)的消息體時(shí),所述消息發(fā)行器再次取出該消息體并發(fā)送給對(duì)應(yīng)的各個(gè)Consumer,由各個(gè)Consumer將接收到的消息體分別發(fā)送給各個(gè)訂閱組件。一旦某個(gè)消息發(fā)行器發(fā)現(xiàn)asynchPublishPool表中找不到其所監(jiān)控的Consumer,就說明該異步訂閱已被取消,于是消息發(fā)行器自動(dòng)終止對(duì)上述Consumer的監(jiān)聽。本發(fā)明實(shí)施例所述組件向消息代理發(fā)送異步訂閱取消信息的實(shí)現(xiàn)原理示意圖如圖9所示,具體處理過程如下已經(jīng)進(jìn)行異步訂閱的組件聯(lián)系消息代理,從消息代理那里獲得一個(gè)Carrier。然后,上述組件將已經(jīng)訂閱的主題和Consumer的信息發(fā)送給上述Carrier,上述Carrier再將接收到的主題和Consumer的信息發(fā)送給消息代理。消息代理再將asynchPublishPool表中記錄的上述組件和所述Consumer的信息的對(duì)應(yīng)關(guān)系進(jìn)行刪除,同時(shí),將asynchSubscribePool表中記錄的所述Consumer的信息和主題的對(duì)應(yīng)關(guān)系進(jìn)行刪除。本發(fā)明實(shí)施例還4是供了本發(fā)明所述方法的一個(gè)應(yīng)用示例。在該應(yīng)用示例中,首先定義如圖10所示的類與類之間的結(jié)構(gòu)示意圖。在圖9所示的類與類之間的結(jié)構(gòu)示意圖中,MessageAgent類通過getMessageAgent()方法獲得唯一實(shí)例。Distributor類繼承了Thread類。Carrier類中的send(Messagemessage)方法用于發(fā)送消息,receive(Topictopic)方法用于同步消息訂閱,subscribe(Topictopic,Consumerconsumer)方法用于異步消息訂閱,unSubscribe(Topictopic,Consumerconsumer)方法用于耳又消訂閱。Consumer4妻口中的consume(Messagemessage)方法用于處J里消息,MyConsumer類是Consumer4妄口的實(shí)王見類。Topic類和Message類是抽象父類,可以通過繼承在此基礎(chǔ)上擴(kuò)展出各種類型的主題和消息。上述應(yīng)用示例中的實(shí)現(xiàn)代碼如下1、發(fā)布消息。獲得唯一的消息代理MessageAgentmessageAgent=MessageAgent.getMessageAgent(),創(chuàng)建消息傳遞者Carriercarrier=messageAgent.creatCarrier();創(chuàng)建主題Topictopic-newStringTopic();topic.setStringTopic("Weather");創(chuàng)建消息Messagemessage=newTextMessage();message.setText("Sunny");message.setTopic(topic);發(fā)送消息carrier,send(message);2、同步訂閱消息。獲得唯一的消息代理MessageAgentmessageAgent=MessageAgent.getMessageAgent創(chuàng)建消息傳遞者Carriercarrier=messageAgent.creatCarrier();創(chuàng)建主題Topictopic-newStringTopic();topic.setStringTopic("Weather");訂閱消息Messagemessage二carrier.receive(topic);3、異步訂閱消息。獲得唯一的消息代理MessageAgentmessageAgent=MessageAgent.getMessageAgentC);創(chuàng)建消息傳遞者Carriercarrier=messageAgent.creatCarrier();創(chuàng)建消費(fèi)者Consumerconsumer=newMyConsumer();創(chuàng)建主題Topictopic二newStringTopic();topic.setStringTopic("Weather");訂閱消息carrier.subscribe(topic,consumer);4、取消訂閱。carrier.unsubscribe(topic,consumer)。綜上所述,本發(fā)明實(shí)施例提出的輕量級(jí)消息機(jī)制是一種線程間的通信,可靠性比分布式進(jìn)程間的通信高很多。該輕量級(jí)消息機(jī)制可以使組件間的數(shù)據(jù)通過消息的方式進(jìn)行傳遞,從而實(shí)現(xiàn)組件間的解耦,降低組件間的耦合度,方便快捷地將不同組件進(jìn)行組合,以滿足符合客戶要求的不同的功能需求,從而實(shí)現(xiàn)客戶的業(yè)務(wù)定制和業(yè)務(wù)升級(jí)能力。本發(fā)明實(shí)施例實(shí)現(xiàn)了單進(jìn)程中組件間的消息通訊,并且本發(fā)明實(shí)施例所述方法和裝置實(shí)現(xiàn)簡(jiǎn)單、使用方便、易于擴(kuò)展;本發(fā)明實(shí)施例解除了組件間代碼級(jí)的依賴關(guān)系,實(shí)現(xiàn)了發(fā)布/訂閱模式的消息傳遞,實(shí)現(xiàn)了異步消息傳遞和消息驅(qū)動(dòng)。前面提到的發(fā)明目的是解決現(xiàn)有軟件系統(tǒng)中組件間進(jìn)行通信的消息4妄口復(fù)雜。本發(fā)明實(shí)施例所述裝置和方法適用于單進(jìn)程軟件系統(tǒng)。以上所述,僅為本發(fā)明實(shí)施例較佳的具體實(shí)施方式,但本發(fā)明實(shí)施例的保護(hù)范圍并不局限于此,任何熟悉本
技術(shù)領(lǐng)域:
的技術(shù)人員在本發(fā)明實(shí)施例揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明實(shí)施例的保護(hù)范圍之內(nèi)。因此,本發(fā)明實(shí)施例的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。權(quán)利要求1、一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置,其特征在于,包括消息代理,所述消息代理具體包括消息池和消息處理模塊,其中,消息池用于保存消息處理模塊傳遞過來的消息;消息處理模塊用于接收組件向消息代理發(fā)送的消息訂閱信息,從消息池中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并將取出的消息發(fā)送給所述發(fā)送消息訂閱信息的組件;接收各個(gè)組件向消息代理發(fā)送的消息并傳遞給消息池。2、根據(jù)權(quán)利要求1所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置,其特征在于,所述消息池包^"舌消息保存模塊用于接收消息處理模塊傳遞過來的各個(gè)組件向消息代理發(fā)送的消息,將接收到的消息進(jìn)行保存,并且保存各個(gè)消息的主題和消息之間的對(duì)應(yīng)關(guān)系。特征在于,所述消息處理模塊具體包括消息接收模塊用于接收各個(gè)組件向消息代理發(fā)送的消息,并將接收到的消息傳遞給消息池;同步訂閱消息處理模塊用于接收各個(gè)組件向消息代理發(fā)送的同步訂閱信息,將所述同步訂閱信息中攜帶的消息的主題和對(duì)應(yīng)的同步消息處理器的信息之間的對(duì)應(yīng)關(guān)系進(jìn)行保存;從消息池中取出所述同步訂閱信息所對(duì)應(yīng)的消息并發(fā)送給所述發(fā)送同步訂閱信息的組件;異步訂閱消息處理模塊用于接收各個(gè)組件向消息代理發(fā)送的異步訂閱信息,將所述異步訂閱消息中攜帶的訂閱組件和異步消息處理器的信息之間的對(duì)應(yīng)關(guān)系進(jìn)行保存;從消息池中取出所述異步訂閱信息所對(duì)應(yīng)的消息并發(fā)送給所述發(fā)送異步訂閱信息的組件。3.<image>imageseeoriginaldocumentpage3</image>4、根據(jù)權(quán)利要求3所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置,其特征在于,所述同步訂閱消息處理模塊具體包括同步訂閱信息接收和保存模塊用于接收組件向消息代理發(fā)送的同步訂閱信息,將所述同步訂閱信息中攜帶的消息的主題和對(duì)應(yīng)的同步消息處理器的信息之間的對(duì)應(yīng)關(guān)系進(jìn)行保存;同步訂閱消息獲取和發(fā)送模塊用于根據(jù)同步訂閱信息中攜帶的所訂閱的消息的主題和對(duì)應(yīng)的同步消息處理器的信息,從消息池中取出組件所訂閱的主題對(duì)應(yīng)的消息和所有同步消息處理器的信息,根據(jù)該所有同步消息處理器的信息獲得相應(yīng)的同步消息處理器,通過各個(gè)同步消息處理器將所述取出的消息分別發(fā)送給各個(gè)對(duì)應(yīng)的組件;通知同步訂閱信息接收和保存it塊將其保存的所述各個(gè)對(duì)應(yīng)的組件所訂閱的主題和同步消息處理器的信息的對(duì)應(yīng)關(guān)系進(jìn)行刪除。5、根據(jù)權(quán)利要求3所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置,其特征在于,所述異步訂閱消息處理模塊具體包括異步訂閱信息接收和保存模塊用于接收組件向消息代理發(fā)送的異步訂閱信息,將所述異步訂閱消息中攜帶的訂閱組件和異步消息處理器的信息之間的對(duì)應(yīng)關(guān)系進(jìn)行保存;異步訂閱消息獲取和發(fā)送模塊用于根據(jù)異步訂閱信息攜帶的訂閱組件對(duì)應(yīng)的異步消息處理器的信息和所訂閱的主題,從消息池中取出組件所訂閱的主題對(duì)應(yīng)的消息和所有異步消息處理器的信息,根據(jù)該所有異步消息處理器的信息獲得相應(yīng)的異步消息處理器,通過各個(gè)異步消息處理器將所述取出的消息分別發(fā)送給各個(gè)對(duì)應(yīng)的組件;異步訂閱取消信息接收模塊用于接收組件向消息代理發(fā)送的異步訂閱取消信息,獲取所述異步訂閱取消信息攜帶的異步消息處理器和主題的信息,通知異步訂閱信息接收和保存模塊將其保存的所述組件和異步消息處理器的信息的對(duì)應(yīng)關(guān)系、所述組件所訂閱的主題和異步消息處理器的信息的對(duì)應(yīng)關(guān)系進(jìn)行刪除。6、一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的方法,其特征在于,在軟件系統(tǒng)中設(shè)置消息代理,所述方法具體包括所述消息代理接收各個(gè)組件發(fā)送的消息,并將接收到的消息進(jìn)4亍保存;所述消息代理接收組件發(fā)送的消息訂閱信息,從所述保存的消息中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并將取出的消息發(fā)送給所述發(fā)送消息訂閱信息的組件。7、根據(jù)權(quán)利要求6所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的方法,其特征在于,所述消息代理接收組件發(fā)送的消息之前具體包括組件創(chuàng)建主題并封裝該主題對(duì)應(yīng)的消息,所述組件將所述消息發(fā)送給從消息代理獲得的同步消息處理器,所述同步消息處理器將接收到的所述消息發(fā)送給消息代理。8、根據(jù)權(quán)利要求6所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的方法,其特征在于,所述消息代理接收組件發(fā)送的消息訂閱信息,從所述保存的消息中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并發(fā)送給所述發(fā)送消息訂閱信息的組件,具體包括組件創(chuàng)建要同步訂閱的消息的主題,所述組件將所述主題發(fā)送給從消息代理獲得的同步消息處理器,所述同步消息處理器將接收到的主題發(fā)送給消息代理,消息代理將接收到的所述主題和同步消息處理器的信息的對(duì)應(yīng)關(guān)系進(jìn)行保存;取出消息代理中保存的所述主題對(duì)應(yīng)的消息,根據(jù)消息代理中保存的所述主題和同步消息處理器的信息的對(duì)應(yīng)關(guān)系,獲得所述主題對(duì)應(yīng)的所有同步消息處理器,將所述消息復(fù)制對(duì)應(yīng)多份后遞交給各個(gè)同步消息處理器,各個(gè)同步消息處理器將所述消息發(fā)送給各個(gè)對(duì)應(yīng)組件;所述消息代理將保存的所述各個(gè)對(duì)應(yīng)的組件所訂閱的主題和同步消息處理器的信息的對(duì)應(yīng)關(guān)系進(jìn)行刪除。9、根據(jù)權(quán)利要求6所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的方法,其特征在于,所述消息代理接收組件發(fā)送的消息訂閱信息,從所述保存的消息中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并發(fā)送給所述發(fā)送消息訂閱信息的組件,具體包括組件創(chuàng)建要異步訂閱的消息的主題,指定取回所異步訂閱的消息的異步消息處理器的信息,所述組件將所述主題和異步消息處理器的信息發(fā)送給消息代理,消息代理將接收到的所述主題和異步消息處理器的信息、所述異步消息處理器的信息和所述組件的對(duì)應(yīng)關(guān)系進(jìn)行保存;取出消息代理中保存的所述主題對(duì)應(yīng)的消息,根據(jù)消息代理中保存的所述主題和異步消息處理器的信息的對(duì)應(yīng)關(guān)系,獲得所述主題對(duì)應(yīng)的所有異步消息處理器,將所述消息復(fù)制對(duì)應(yīng)多份后遞交給各個(gè)異步消息處理器,各個(gè)異步消息處理器將所述消息發(fā)送給各個(gè)對(duì)應(yīng)組件;所述消息代理將保存的所述各個(gè)對(duì)應(yīng)組件所訂閱的主題和異步消息處理器的信息、所述異步消息處理器的信息和所述組件的對(duì)應(yīng)關(guān)系進(jìn)行刪除。10、根據(jù)權(quán)利要求6所述的實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的方法,其特征在于,所述方法具體包括組件向消息代理發(fā)送攜帶異步訂閱的消息的主題和異步消息處理器的信息的異步訂閱取消消息,消息代理將保存的所述主題和異步消息處理器的信息、所述異步消息處理器的信息和所述組件的對(duì)應(yīng)關(guān)系進(jìn)行刪除。全文摘要本發(fā)明提供了一種實(shí)現(xiàn)單進(jìn)程中組件間進(jìn)行通信的裝置,該裝置主要包括消息代理。該方法主要包括所述消息代理接收各個(gè)組件發(fā)送的消息,并將接收到的消息進(jìn)行保存;所述消息代理接收組件發(fā)送的消息訂閱信息,從所述保存的消息中取出所述消息訂閱信息所對(duì)應(yīng)的消息,并將取出的消息發(fā)送給所述發(fā)送消息訂閱信息的組件。本發(fā)明所述裝置和方法,實(shí)現(xiàn)了單進(jìn)程中組件間的消息通訊,并且具有實(shí)現(xiàn)簡(jiǎn)單、使用方便、易于擴(kuò)展的特點(diǎn)。文檔編號(hào)G06F9/46GK101315609SQ200710099928公開日2008年12月3日申請(qǐng)日期2007年5月31日優(yōu)先權(quán)日2007年5月31日發(fā)明者曉賀申請(qǐng)人:華為技術(shù)有限公司