模式發(fā)現(xiàn)者
:
蔡超
北京天融信,軟件架構(gòu)師
SUN certified Enterprise Architect
Microsoft certified Solution Developer
IBM certified RUP Specialist
聯(lián)系方式
:cai_chao@topsec.com.cn,chaocai2001@yahoo.com.cn
010-82776427
語(yǔ)境
在基于異步通信方式的系統(tǒng)中,實(shí)現(xiàn)模塊的同步調(diào)用。
問(wèn)題
消息隊(duì)列已經(jīng)成為目前很多軟件選用的通訊方式,消息模式使得不同分布式組件間的耦合性較為松散,提高了系統(tǒng)的可維護(hù)性和可擴(kuò)充性。但是有時(shí)我們希望在這種情況下能夠模擬同步的調(diào)用方式,希望能夠通過(guò)一個(gè)組件透明的幫我們實(shí)現(xiàn)這種異步和同步調(diào)用的轉(zhuǎn)換。
解決方案
圖表
1
基于消息的分布式系統(tǒng)
上圖是一種常見的基于消息的分布系統(tǒng)結(jié)構(gòu),系統(tǒng)中包含兩條隊(duì)列。命令隊(duì)列用于傳送模塊間相互調(diào)用的命令對(duì)象,響應(yīng)隊(duì)列用于傳送命令處理后的響應(yīng)結(jié)果對(duì)象。
在通常情況下消息隊(duì)列上的模塊會(huì)以異步的方式工作,這種情況下模塊通常不關(guān)心命令執(zhí)行后的狀況,常常是不須返回值的。
為了模擬同步調(diào)用我們通過(guò)一個(gè)
SynProxy
組件來(lái)幫助我們完成由異步到同步調(diào)用的模擬。使得
Client
對(duì)其他模塊的調(diào)好像是同步的一樣。
SynProxy
組件的結(jié)構(gòu)如下:
圖表
2
SynProxy
的靜態(tài)結(jié)構(gòu)
SynProxy:
組織完成異步到同步調(diào)用的轉(zhuǎn)換
WaitingQueue:
存放還未獲得執(zhí)行返回值的
Command
對(duì)象
UIDCreator:
產(chǎn)生能夠唯一標(biāo)示每個(gè)
Command
對(duì)象的
UID
ResponseReceiver:
監(jiān)聽響應(yīng)隊(duì)列中的響應(yīng)消息,它在獨(dú)立的線程中運(yùn)行
Command
:命令對(duì)象
Response
:響應(yīng)對(duì)象
?
圖表
3
將異同步調(diào)用轉(zhuǎn)化成同步調(diào)用的過(guò)程
部分解釋:
(
以上以在
JAVA
環(huán)境中為例
)
Wait
表示調(diào)用
Command
的
wait
方法阻塞住當(dāng)前線程
Command
執(zhí)行模塊在執(zhí)行了響應(yīng)操作后生產(chǎn)
Response
對(duì)象用于放回結(jié)果,
Response
對(duì)象中的
UID
屬性應(yīng)該與處理的
Command
的
UID
的值相同
Notify
表示調(diào)用
Command
的
notify
方法喚醒被阻塞的線程
上面過(guò)程中的
wait
設(shè)置了阻塞的超時(shí)時(shí)間(來(lái)自于
Command
對(duì)象的屬性值)