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