本發(fā)明涉及軟件事件管理技術(shù)領(lǐng)域,更具體地,涉及一種軟件模塊間的事件路由框架及方法。
背景技術(shù):
軟件工程中所指的耦合是指兩個(gè)或兩個(gè)以上的軟件模塊或線(xiàn)程的輸入與輸出之間存在緊密配合與相互影響,并通過(guò)相互作用從一側(cè)向另一側(cè)傳輸能量的現(xiàn)象。
現(xiàn)有技術(shù)中,軟件架構(gòu)設(shè)計(jì)中通常為了提高軟件的可擴(kuò)展性往往架構(gòu)設(shè)計(jì)人員會(huì)盡可能的將軟件框架中的模塊與外界盡可能少的產(chǎn)生耦合關(guān)系,最理想的情況下是模塊能夠做到其他模塊無(wú)耦合關(guān)聯(lián)性。這樣軟件框架中的模塊才能夠?qū)崿F(xiàn)低耦合高內(nèi)聚的設(shè)計(jì)原則,但是一個(gè)模塊如果盡可能少的對(duì)外暴露接口那么帶來(lái)的結(jié)果就是其他模塊如果想和該模塊進(jìn)行通信就變得異常復(fù)雜或者幾乎沒(méi)有通信的可能性。
所以,現(xiàn)有技術(shù)中亟需實(shí)現(xiàn)軟件中各功能模塊低耦合高內(nèi)聚的技術(shù)方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明為克服上述問(wèn)題或者至少部分地解決上述問(wèn)題,提供一種軟件模塊間的事件路由框架及方法。
根據(jù)本發(fā)明的一個(gè)方面與所述接口層相連,提供一種軟件模塊間的事件路由框架,包括事件訂閱層、事件處理層和接口層:
所述事件訂閱層分別與所述事件訂閱層和事件處理層相連,用于通過(guò)識(shí)別軟件中各模塊標(biāo)識(shí)信息的方式,將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)在所述事件訂閱層的訂閱者集合中;
所述接口層與所述接口層相連,用于接收第一模塊發(fā)送的事件請(qǐng)求,基于所述事件請(qǐng)求中的目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理;
所述事件處理層,用于確認(rèn)事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中。
進(jìn)一步,所述事件處理層還包括:路由機(jī)制單元,用于利用事件請(qǐng)求處理優(yōu)先級(jí)機(jī)制、事件請(qǐng)求并發(fā)處理機(jī)制和事件請(qǐng)求緩存機(jī)制中的至少一種,進(jìn)行所述事件請(qǐng)求的處理。
進(jìn)一步,所述事件處理層還包括:
刪除單元,用于實(shí)時(shí)監(jiān)控所述第一模塊是否發(fā)出退出路由框架的請(qǐng)求;當(dāng)檢測(cè)到所述第一模塊發(fā)出退出路由框架的請(qǐng)求時(shí),建立至少一個(gè)新的線(xiàn)程用于刪除所述第一模塊在所述框架中的相關(guān)事件請(qǐng)求信息。
進(jìn)一步,所述事件訂閱層還包括存儲(chǔ)單元,用于將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)以靜態(tài)變量的形式存儲(chǔ)在訂閱者集合中。
進(jìn)一步,所述路由機(jī)制單元進(jìn)一步用于:根據(jù)事件請(qǐng)求的優(yōu)先級(jí)高低,在待處理隊(duì)列中對(duì)所有事件請(qǐng)求進(jìn)行由高到低的排序,根據(jù)排序?qū)λ鍪录?qǐng)求進(jìn)行處理。
進(jìn)一步,所述路由機(jī)制單元進(jìn)一步包括用于:
s1,將多個(gè)事件請(qǐng)求設(shè)計(jì)為一個(gè)同步隊(duì)列,在所述同步隊(duì)列內(nèi)設(shè)置一個(gè)鎖鑰對(duì);
s2,當(dāng)事件請(qǐng)求到達(dá)所述同步隊(duì)列后,首先搜尋所述同步隊(duì)列的鑰匙:當(dāng)成功獲取鑰匙時(shí),所述同步隊(duì)列將所述事件請(qǐng)求添加到待處理隊(duì)列中,當(dāng)獲取鑰匙失敗時(shí),將所述事件請(qǐng)求加入緩存隊(duì)列中;
s3,通過(guò)不斷觸發(fā)預(yù)設(shè)事件的方式使得所述事件請(qǐng)求再次進(jìn)入所述同步隊(duì)列執(zhí)行所述s2,直至該事件請(qǐng)求成功獲取所述同步隊(duì)列的鑰匙。
進(jìn)一步,所述路由機(jī)制單元進(jìn)一步用于:將所述事件處理層待處理的所有目標(biāo)事件添加至同一個(gè)緩存隊(duì)列;確認(rèn)新的事件請(qǐng)求存在于所述緩存隊(duì)列中,將所述緩存隊(duì)列中的所述新的事件請(qǐng)求再次投遞到消息隊(duì)列中;所述緩存隊(duì)列能夠存儲(chǔ)的目標(biāo)事件的上限為n,其中n>0。
進(jìn)一步,所述刪除單元進(jìn)一步用于刪除以下請(qǐng)求中的至少一種:所述待處理隊(duì)列中所述第一模塊發(fā)送的所有事件請(qǐng)求、所述同步隊(duì)列中所述第一模塊發(fā)送的所有事件請(qǐng)求和所述緩存隊(duì)中所述第一模塊發(fā)送的所有事件請(qǐng)求。
根據(jù)本發(fā)明的一個(gè)方面,提供一種利用上述事件路由框架進(jìn)行軟件模塊間事件路由的方法,包括:
步驟1,接收第一模塊發(fā)送的事件請(qǐng)求;
步驟2,確認(rèn)所述事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中;
步驟3,基于所述目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理。
進(jìn)一步,所述步驟2前還包括:
步驟1’,通過(guò)識(shí)別所述軟件中各模塊標(biāo)識(shí)信息的方法,將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)在所述框架中事件訂閱層的訂閱者集合中。
本申請(qǐng)?zhí)岢鲆环N軟件模塊間的事件路由框架及方法,本發(fā)明所述方案具有如下有益效果:1、有效的降低了軟件模塊間耦合所引起的內(nèi)存泄漏問(wèn)題;2、提高了軟件模塊及軟件模塊間代碼的可維護(hù)性;3、多種消息路由機(jī)制極大的提高了路由方法的穩(wěn)定性和高效性。
附圖說(shuō)明
圖1為根據(jù)本發(fā)明實(shí)施例一種軟件模塊間的事件路由框架的整體結(jié)構(gòu)示意圖;
圖2為根據(jù)本發(fā)明實(shí)施例一種軟件模塊間的事件路由方法的整體流程示意圖;
圖3為根據(jù)本發(fā)明實(shí)施例一種軟件模塊間的事件路由方法的裝置的結(jié)構(gòu)示意圖;
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說(shuō)明本發(fā)明,但不用來(lái)限制本發(fā)明的范圍。
如圖1,示出本發(fā)明一個(gè)具體實(shí)施例中一種軟件模塊間的事件路由框架整體框架示意圖??傮w上,包括:
包括事件訂閱層l1、事件處理層l2和接口層l3:
所述事件訂閱層l1與所述接口層相連,用于通過(guò)識(shí)別軟件中各模塊標(biāo)識(shí)信息的方式,將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)在所述事件訂閱層l1的訂閱者集合中;
所述接口層l2分別與所述事件訂閱層和事件處理層相連,用于接收第一模塊發(fā)送的事件請(qǐng)求,基于所述事件請(qǐng)求中的目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理;
所述事件處理層l3與所述接口層相連,用于確認(rèn)事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中。
在本發(fā)明具體實(shí)施例中,提供了一種軟件模塊間的事件路由框架,框架能夠起到有效使得相互隔離的軟件模塊之間進(jìn)行信息交換,從而降低各模塊間耦合的有益效果。
在本發(fā)明具體實(shí)施例中,提供了一種軟件模塊間的事件路由框架,沒(méi)有使用傳統(tǒng)的調(diào)用集合中的add方法來(lái)進(jìn)行事件注冊(cè),而是使用的注解方式來(lái)實(shí)現(xiàn)消息接受者的信息注冊(cè),解決了現(xiàn)有技術(shù)中add方法會(huì)產(chǎn)生大量的雷同代碼,并且代碼數(shù)量的劇增導(dǎo)致后期的維護(hù)成本會(huì)增加的技術(shù)問(wèn)題。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述事件處理層還包括:路由機(jī)制單元,用于利用事件請(qǐng)求處理優(yōu)先級(jí)機(jī)制、事件請(qǐng)求并發(fā)處理機(jī)制和事件請(qǐng)求緩存機(jī)制中的至少一種,進(jìn)行所述事件請(qǐng)求的處理。
在本發(fā)明具體實(shí)施例中,提供了一種軟件模塊間的事件路由框架,所述處理模塊執(zhí)行的各個(gè)步驟是一個(gè)正常的信息交過(guò)過(guò)程,為了提高整個(gè)路由框架的穩(wěn)健性和并發(fā)性,本具體實(shí)施例中利用上述機(jī)制中的至少一種對(duì)整個(gè)路由框架做了相應(yīng)的優(yōu)化處理。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述事件處理層還包括:
刪除單元,用于實(shí)時(shí)監(jiān)控所述第一模塊是否發(fā)出退出路由框架的請(qǐng)求;當(dāng)檢測(cè)到所述第一模塊發(fā)出退出路由框架的請(qǐng)求時(shí),建立至少一個(gè)新的線(xiàn)程用于刪除所述第一模塊在所述框架中的相關(guān)事件請(qǐng)求信息。
在本發(fā)明具體實(shí)施例中,提供了一種軟件模塊間的事件路由框架,所述刪除單元能夠保證所述第一模塊歷史申請(qǐng)的內(nèi)存能夠及時(shí)被框架回收,從而就有效的避免了所述第一模塊產(chǎn)生內(nèi)存泄漏的風(fēng)險(xiǎn)。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述事件訂閱層還包括存儲(chǔ)單元,用于將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)以靜態(tài)變量的形式存儲(chǔ)在訂閱者集合中。
在本發(fā)明具體實(shí)施例中,提供了一種軟件模塊間的事件路由框架,通過(guò)static方式將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ),所述存放的消息會(huì)在內(nèi)存的靜態(tài)區(qū)中,存放在靜態(tài)區(qū)的內(nèi)容在整個(gè)框架中有且僅有一份拷貝,這樣就能夠確保存儲(chǔ)的各事件信息是全局唯一存在的。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述路由機(jī)制單元進(jìn)一步用于:根據(jù)事件請(qǐng)求的優(yōu)先級(jí)高低,在待處理隊(duì)列中對(duì)所有事件請(qǐng)求進(jìn)行由高到低的排序,根據(jù)排序?qū)λ鍪录?qǐng)求進(jìn)行處理。
在本具體實(shí)施例中,上述事件請(qǐng)求處理優(yōu)先級(jí)機(jī)制,能夠使得路由框架判定當(dāng)前消息的優(yōu)先級(jí)并將該消息插入到消息隊(duì)列中相應(yīng)的位置。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述路由機(jī)制單元進(jìn)一步包括用于:
s1,將多個(gè)事件請(qǐng)求設(shè)計(jì)為一個(gè)同步隊(duì)列,在所述同步隊(duì)列內(nèi)設(shè)置一個(gè)鎖鑰對(duì);
s2,當(dāng)事件請(qǐng)求到達(dá)所述同步隊(duì)列后,首先搜尋所述同步隊(duì)列的鑰匙:當(dāng)成功獲取鑰匙時(shí),所述同步隊(duì)列將所述事件請(qǐng)求添加到待處理隊(duì)列中,當(dāng)獲取鑰匙失敗時(shí),將所述事件請(qǐng)求加入緩存隊(duì)列中;
s3,通過(guò)不斷觸發(fā)預(yù)設(shè)事件的方式使得所述事件請(qǐng)求再次進(jìn)入所述同步隊(duì)列執(zhí)行所述s2,直至該事件請(qǐng)求成功獲取所述同步隊(duì)列的鑰匙。
本具體實(shí)施例能夠解決并發(fā)消息發(fā)生的時(shí)候概率性導(dǎo)致消息丟失的可能性。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述路由機(jī)制單元進(jìn)一步用于:將所述事件處理層待處理的所有目標(biāo)事件添加至同一個(gè)緩存隊(duì)列;確認(rèn)新的事件請(qǐng)求存在于所述緩存隊(duì)列中,將所述緩存隊(duì)列中的所述新的事件請(qǐng)求再次投遞到消息隊(duì)列中;所述緩存隊(duì)列能夠存儲(chǔ)的目標(biāo)事件的上限為n,其中n>0。
本具體實(shí)施例可以極大的提升框架的能力和處理效率。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述刪除單元進(jìn)一步用于刪除以下請(qǐng)求中的至少一種:所述待處理隊(duì)列中所述第一模塊發(fā)送的所有事件請(qǐng)求、所述同步隊(duì)列中所述第一模塊發(fā)送的所有事件請(qǐng)求和所述緩存隊(duì)中所述第一模塊發(fā)送的所有事件請(qǐng)求。
本具體實(shí)施例能夠?qū)⒙酚煽蚣苤械乃邢⑷窟M(jìn)行刪除,從而有效的起到了防止因第一模塊殘留信息而導(dǎo)致的內(nèi)存泄漏的問(wèn)題。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,所述事件請(qǐng)求包括:事件接收模塊的地址信息和所述事件請(qǐng)求的數(shù)據(jù)信息;所述事件請(qǐng)求的數(shù)據(jù)信息為json格式。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由框架,下面結(jié)合具體實(shí)例對(duì)所述方法展開(kāi)進(jìn)一步的說(shuō)明。
本具體實(shí)施例設(shè)計(jì)了一個(gè)事件路由框架,通過(guò)所述事件路由框架可以建立起模塊與模塊之間的關(guān)聯(lián),本具體實(shí)施例方案能夠達(dá)到模塊之間的低耦合高內(nèi)聚的要求的同時(shí)又能自由的和其他模塊之間進(jìn)行消息通信,該框架能夠有效的使得相互隔離的組件之間進(jìn)行信息交換。
首先,事件路由框架的層級(jí)劃分,整個(gè)路由框架的設(shè)計(jì)分為如下幾層:
路由事件的訂閱層:該層主要用于將消息注冊(cè)到路由框架中的。
消息的路由機(jī)制層:該層主要用于描述路由框架對(duì)消息路由的策略和實(shí)現(xiàn)方法。
消息的釋放層:該層描述的是路由框架如何將消息進(jìn)行示范回收內(nèi)存的機(jī)制。
其次,詳細(xì)描述具體每個(gè)層級(jí)具體實(shí)施時(shí)的實(shí)現(xiàn)手段和實(shí)現(xiàn)細(xì)節(jié)。
1、路由事件訂閱層
路由事件訂閱層的核心任務(wù)是將消息接受者注冊(cè)到路由框架中,讓路由框架層知道哪些消息是被哪些處理類(lèi)所接收的。本具體實(shí)施例中沒(méi)有使用傳統(tǒng)的調(diào)用集合中的add方法來(lái)進(jìn)行事件注冊(cè),而是使用注解的方式來(lái)實(shí)現(xiàn)消息接受者的信息注冊(cè)。
如果通過(guò)傳統(tǒng)的方案使用集合并調(diào)用集合中的add方法來(lái)將信息傳遞到路由框架中,這樣會(huì)產(chǎn)生大量的雷同代碼,并且由于代碼數(shù)量的劇增導(dǎo)致后期的維護(hù)成本會(huì)增加。本具體實(shí)施例通過(guò)利用自定義的注解器來(lái)實(shí)現(xiàn)消息接受者注冊(cè)到路由框架中,有效的解決了傳統(tǒng)方案的不足之處。
為了統(tǒng)一消息注冊(cè)的規(guī)范,將消息注冊(cè)封裝成一個(gè)接口,需要注冊(cè)消息的實(shí)體需要實(shí)現(xiàn)該消息接口并通過(guò)接口將消息傳遞給路由框架。
定義好消息注冊(cè)接口后,通過(guò)注解的方式來(lái)實(shí)現(xiàn)路由事件的訂閱,具體的實(shí)現(xiàn)方法如下所述:
注解方式來(lái)訂閱路由:通過(guò)定義自定義的注解@bindrouter,當(dāng)定義了自定義的注解之后需要實(shí)現(xiàn)該注解的解析。為了解析@bindrouter自定義的注解,定義了注解的解析類(lèi)parseannotation,在parseannotation類(lèi)中通過(guò)調(diào)用getannotation方法獲取到解析java源文件中的@bindrouter開(kāi)頭的注解,然后再次調(diào)用getvalue方法獲取到具體注解器的詳細(xì)信息,然后在通過(guò)調(diào)用add方法將接收事件訂閱到路由框架中。
使用注解方式的好處是整個(gè)事件的訂閱僅僅需要在事件上增加@bindrouter的自定義注解,注解解析器就會(huì)在編譯階段自動(dòng)將需要訂閱的事件存放到路由框架中。
單框架初始化的時(shí)候會(huì)去調(diào)用路由框架的初始化函數(shù)init,init函數(shù)會(huì)自動(dòng)調(diào)用注解器解析好的訂閱代碼,使得所有的訂閱信息全部存放在路由框架的集合a中。并且集合a是通過(guò)static方式來(lái)進(jìn)行申明的,該集合會(huì)存放在內(nèi)存的靜態(tài)區(qū)中,存放在靜態(tài)區(qū)的內(nèi)容在整個(gè)框架中有且僅有一份拷貝,這樣就能夠確保的集合a是全局唯一存在的。
2、消息的路由機(jī)制
本段主要講解消息路由的相關(guān)原理和實(shí)現(xiàn)手段。由于每個(gè)模塊是獨(dú)立存在的,所以如果模塊modela希望發(fā)送信息到modelb中,此時(shí)modela就需要向路由框架中發(fā)送事件請(qǐng)求。通過(guò)事件到達(dá)路由框架后,經(jīng)過(guò)路由框架處理分發(fā)到對(duì)應(yīng)的訂閱者中。
接下來(lái)對(duì)于消息的分發(fā)詳細(xì)來(lái)進(jìn)行分析和解釋?zhuān)琺odela如果希望發(fā)送信息到modelb需要傳遞給路由器如下信息:
消息的目的地:也即是消息的接受者信息,本方案中消息的目的地是通過(guò)一串唯一的rul(地址)來(lái)進(jìn)行標(biāo)定的(類(lèi)似于網(wǎng)址的網(wǎng)站地址的設(shè)計(jì)思路)。
傳遞的消息信息:為了方便雙方進(jìn)行信息交換,本方案中消息機(jī)制使用的是通用個(gè)json格式數(shù)據(jù)來(lái)進(jìn)行消息通信的媒介。
發(fā)送一條信息過(guò)程中,信息發(fā)送者modela通過(guò)調(diào)用post(url,jsonparam)方法可以向路由框架中投放一個(gè)消息事件。其中url表示的是路由框架的訂閱者的唯一地址,jsonparam表示需要傳遞的消息數(shù)據(jù),其格式是json格式的數(shù)據(jù)類(lèi)型。
信息到達(dá)路由框架后路由器首先會(huì)通過(guò)調(diào)用geturl方法獲取到目的地址信息,然后拿到目的地址信息在訂閱者集合a中進(jìn)行尋找,判定訂閱者集合a中是否存在需要投放消息的接受者,如果沒(méi)有找到就不進(jìn)行消息投放,如果找到了就會(huì)將消息投遞到接收者modelb中,同時(shí)將發(fā)送者傳遞的jsonparam參數(shù)傳遞到modelb中,這樣就完成了一次消息的交換過(guò)程。
上述過(guò)程是一個(gè)正常的信息交過(guò)過(guò)程,為了提高整個(gè)路由機(jī)制的穩(wěn)健性和并發(fā)性對(duì)整個(gè)消息路由做了如下優(yōu)化處理:
消息優(yōu)先級(jí)劃分:
為了提高消息處理的及時(shí)性,將消息劃分為3個(gè)等級(jí),等級(jí)越高表明優(yōu)先級(jí)越高,等級(jí)越低表明優(yōu)先級(jí)越低。這樣當(dāng)消息投遞到路由框架中的時(shí)候。路由框架會(huì)判定當(dāng)前消息的優(yōu)先級(jí)并將該消息插入到消息隊(duì)列中相應(yīng)的位置。例如,如果消息隊(duì)列中的等級(jí)排列為1123接下來(lái)需要插入一條等級(jí)為3的消息,此時(shí)消息對(duì)列的排列為11233,會(huì)講等級(jí)為3的消息插入到原來(lái)隊(duì)列中等級(jí)為3的隊(duì)列后面。所有消息達(dá)到后都會(huì)按照類(lèi)似的方式來(lái)對(duì)消息進(jìn)行插入,這樣就能夠?qū)ο⑦M(jìn)行有優(yōu)先級(jí)的處理。
消息隊(duì)列并發(fā)的處理:
為了解決多個(gè)消息同時(shí)到達(dá)路由框架的時(shí)候概率性導(dǎo)致消息丟失的問(wèn)題,將消息隊(duì)列設(shè)計(jì)為一個(gè)同步隊(duì)列。同步隊(duì)列內(nèi)部有一個(gè)鎖,當(dāng)有消息到達(dá)同步隊(duì)列后首先會(huì)找同步隊(duì)列獲取該條鎖的鑰匙,如果獲取到鑰匙了,同步隊(duì)列就會(huì)對(duì)該條消息添加到隊(duì)列中這個(gè)過(guò)程。如果沒(méi)有獲取到鑰匙,會(huì)構(gòu)建一條緩存隊(duì)列,沒(méi)有獲取到鎖的消息會(huì)在緩存隊(duì)列中然后會(huì)通過(guò)調(diào)用定時(shí)來(lái)定時(shí)觸發(fā)的方式來(lái)取出緩存隊(duì)列中的消息然后視圖讓該消息再次去獲取同步隊(duì)列的鎖。如果獲取到同步隊(duì)列的鑰匙,同步隊(duì)列就會(huì)處理該條消息否則會(huì)重復(fù)上述過(guò)程,這樣就能夠解決并發(fā)消息發(fā)生的時(shí)候概率性導(dǎo)致消息丟失的可能性。
消息緩存機(jī)制:
對(duì)于只要是進(jìn)入消息隊(duì)列的消息就會(huì)對(duì)該條消息進(jìn)行緩存處理,緩存的方法是每次當(dāng)消息投遞到訂閱者的時(shí)候就會(huì)將消息添加到一個(gè)普通的集合中。本方案中將緩存集合的大小定位30條,這樣可以緩存最近處理的30條消息信息。緩存消息的目的有2個(gè),其一是可以隨時(shí)查看和調(diào)試當(dāng)前路由框架已經(jīng)處理成功的最近30條消息有哪一些。其二是如果需要投遞重復(fù)消息的時(shí)候不用再去實(shí)例化消息了,因?yàn)閷?shí)例化消息對(duì)框架的開(kāi)銷(xiāo)是非常大的,可以直接從緩存對(duì)內(nèi)中拿到曾經(jīng)投遞過(guò)的消息然后再次投遞到消息隊(duì)列中,這樣可以極大的提升框架的能力和處理效率。
3、消息的釋放
由于路由框架會(huì)和modela與modelb都有耦合關(guān)系,并且路由框架是常駐內(nèi)存的,如果modela的功能已經(jīng)使用完成了并且后續(xù)也不會(huì)在使用了,此時(shí)要對(duì)modela的資源進(jìn)行釋放,如果路由框架沒(méi)有對(duì)modela的任何消息和事件進(jìn)行引用,那么modela是能夠正常被釋放的,但是如果modela中的有一些信息一直在路由框架中沒(méi)有被處理這樣就會(huì)導(dǎo)致modela長(zhǎng)期不能夠釋放,這樣就會(huì)導(dǎo)致框架的內(nèi)存長(zhǎng)時(shí)間存放在內(nèi)存中,從而產(chǎn)生內(nèi)存泄漏的問(wèn)題。
為了解決該問(wèn)題在路由框架中設(shè)置了一條綠色通道,該條綠色通道什么都不做主要是用來(lái)接收釋放消息的。如果modela需要退出的時(shí)候,也不期望后面的消息被繼續(xù)處理了,此時(shí)modela可以向綠色通道發(fā)送一條自己要退出的信息,此時(shí)路由框架會(huì)開(kāi)啟一個(gè)新的線(xiàn)程去消息同步隊(duì)列中將modela發(fā)送的所有消息通過(guò)remove方法全部刪除掉。并且將緩存隊(duì)列中的和等待隊(duì)列中的和modela相關(guān)的所有消息全部清除。這樣就將路由框架中的所有消息全部都刪除掉了。
這樣就能夠保證modela之前申請(qǐng)的內(nèi)存能夠及時(shí)被框架回收,從而就有效的避免了modela產(chǎn)生內(nèi)存泄漏的危險(xiǎn)。
本方案設(shè)計(jì)了一套高效的事件路由框架,事件的訂閱使用了自定義注解的方式來(lái)實(shí)現(xiàn)可以極大的提高代碼的可維護(hù)性。消息路由機(jī)制增加了消息優(yōu)先級(jí),并發(fā),緩存等特殊處理極大的提高了路由框架的穩(wěn)定性和高效性。對(duì)消息的釋放開(kāi)辟了一條綠色通道有效的降低了耦合所引起的內(nèi)存泄漏等問(wèn)題。
如圖2,示出本發(fā)明一個(gè)具體實(shí)施例中,示出本一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法。整體上,包括:
步驟1,接收第一模塊發(fā)送的事件請(qǐng)求;
步驟2,確認(rèn)所述事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中;
步驟3,基于所述目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法,所述步驟2前還包括:
步驟1’,通過(guò)識(shí)別所述軟件中各模塊標(biāo)識(shí)信息的方法,將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)在所述框架中事件訂閱層的訂閱者集合中。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法,所述步驟2還包括:
利用事件請(qǐng)求處理優(yōu)先級(jí)機(jī)制、事件請(qǐng)求并發(fā)處理機(jī)制和事件請(qǐng)求緩存機(jī)制中的至少一種,進(jìn)行所述事件請(qǐng)求的處理。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法,還包括:
步驟4,實(shí)時(shí)監(jiān)控所述第一模塊是否發(fā)出退出路由框架請(qǐng)求;當(dāng)檢測(cè)到所述第一模塊發(fā)出退出路由框架請(qǐng)求時(shí),建立至少一個(gè)新的線(xiàn)程用于刪除所述第一模塊的相關(guān)事件請(qǐng)求信息。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由方法,所述步驟0還包括:將所述各模塊中與所述標(biāo)識(shí)信息對(duì)應(yīng)的事件存儲(chǔ)以靜態(tài)變量的形式進(jìn)行保存。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由方法,所述事件請(qǐng)求處理優(yōu)先級(jí)機(jī)制一步包括:根據(jù)事件請(qǐng)求的優(yōu)先級(jí)高低,在待處理隊(duì)列中對(duì)所有事件請(qǐng)求進(jìn)行由高到低的排序,根據(jù)排序?qū)λ鍪录?qǐng)求進(jìn)行處理。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種軟件模塊間的事件路由方法,所述目標(biāo)事件并發(fā)處理機(jī)制進(jìn)一步包括:
s1,將多個(gè)事件請(qǐng)求設(shè)計(jì)為一個(gè)同步隊(duì)列,在所述同步隊(duì)列內(nèi)設(shè)置一個(gè)鎖鑰對(duì);
s2,當(dāng)事件請(qǐng)求到達(dá)所述同步隊(duì)列后,首先搜尋所述同步隊(duì)列的鑰匙:當(dāng)成功獲取鑰匙時(shí),所述同步隊(duì)列將所述事件請(qǐng)求添加到待處理隊(duì)列中,當(dāng)獲取鑰匙失敗時(shí),將所述事件請(qǐng)求加入緩存隊(duì)列中;
s3,通過(guò)不斷觸發(fā)預(yù)設(shè)事件的方式使得所述事件請(qǐng)求再次進(jìn)入所述同步隊(duì)列執(zhí)行所述s2,直至該事件請(qǐng)求成功獲取所述同步隊(duì)列的鑰匙。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法,所述目標(biāo)事件緩存機(jī)制進(jìn)一步包括:將所述事件處理層待處理的所有目標(biāo)事件添加至同一個(gè)緩存隊(duì)列;確認(rèn)新的事件請(qǐng)求存在于所述緩存隊(duì)列中,將所述緩存隊(duì)列中的所述新的事件請(qǐng)求再次投遞到消息隊(duì)列中;所述緩存隊(duì)列能夠存儲(chǔ)的目標(biāo)事件的上限為n,其中n>0。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法,所述步驟4進(jìn)一步包括刪除以下至少一種:所述待處理隊(duì)列中所述第一模塊發(fā)送的所有事件請(qǐng)求、所述同步隊(duì)列中所述第一模塊發(fā)送的所有事件請(qǐng)求和所述緩存隊(duì)中所述第一模塊發(fā)送的所有事件請(qǐng)求。
在本發(fā)明另一個(gè)具體實(shí)施例中,一種利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法,所述事件請(qǐng)求包括:事件接收模塊的地址信息和所述事件請(qǐng)求的數(shù)據(jù)信息;所述事件請(qǐng)求的數(shù)據(jù)信息為json格式。
圖3是示出本申請(qǐng)實(shí)施例的利用上述所有實(shí)施例中所述的事件路由框架進(jìn)行軟件模塊間的事件路由方法的設(shè)備的結(jié)構(gòu)框圖。
參照?qǐng)D3,所述wdm-fso網(wǎng)絡(luò)節(jié)點(diǎn)資源共享方法的測(cè)試設(shè)備,包括:處理器(processor)301、存儲(chǔ)器(memory)302、通信接口(communicationsinterface)303和總線(xiàn)304;
其中,
所述處理器301、存儲(chǔ)器302、通信接口303通過(guò)所述總線(xiàn)304完成相互間的通信;
所述通信接口303用于該測(cè)試設(shè)備與軟件模塊間的事件路由的通信設(shè)備之間的信息傳輸;
所述處理器301用于調(diào)用所述存儲(chǔ)器302中的程序指令,以執(zhí)行上述各方法實(shí)施例所提供的方法,例如包括:步驟1,接收第一模塊發(fā)送的事件請(qǐng)求;步驟2,確認(rèn)所述事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中;步驟3,基于所述目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理。
本實(shí)施例公開(kāi)一種計(jì)算機(jī)程序產(chǎn)品,所述計(jì)算機(jī)程序產(chǎn)品包括存儲(chǔ)在非暫態(tài)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上的計(jì)算機(jī)程序,所述計(jì)算機(jī)程序包括程序指令,當(dāng)所述程序指令被計(jì)算機(jī)執(zhí)行時(shí),計(jì)算機(jī)能夠執(zhí)行上述各方法實(shí)施例所提供的方法,例如包括:步驟1,接收第一模塊發(fā)送的事件請(qǐng)求;步驟2,確認(rèn)所述事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中;步驟3,基于所述目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理。
本實(shí)施例提供一種非暫態(tài)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述非暫態(tài)計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)存儲(chǔ)計(jì)算機(jī)指令,所述計(jì)算機(jī)指令使所述計(jì)算機(jī)執(zhí)行上述各方法實(shí)施例所提供的方法,例如包括:步驟1,接收第一模塊發(fā)送的事件請(qǐng)求;步驟2,確認(rèn)所述事件請(qǐng)求中的目標(biāo)地址信息所指向的事件存在于所述路由框架的訂閱者集合中;步驟3,基于所述目標(biāo)地址信息將所述事件請(qǐng)求發(fā)送給第二模塊處理。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過(guò)程序指令相關(guān)的硬件來(lái)完成,前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:rom、ram、磁碟或者光盤(pán)等各種可以存儲(chǔ)程序代碼的介質(zhì)。
以上所描述的軟件模塊間的事件路由方法的設(shè)備等實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性的勞動(dòng)的情況下,即可以理解并實(shí)施。
通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到各實(shí)施方式可借助軟件加必需的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn),當(dāng)然也可以通過(guò)硬件?;谶@樣的理解,上述技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,如rom/ram、磁碟、光盤(pán)等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。
最后,本申請(qǐng)的方法僅為較佳的實(shí)施方案,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。