J2EE之巔

           

          同步代理模式 Synchronization Proxy Pattern

          模式發現者 : 蔡超

          北京天融信,軟件架構師

          SUN certified Enterprise Architect

          Microsoft certified Solution Developer

          IBM certified RUP Specialist

          聯系方式 :cai_chao@topsec.com.cn,chaocai2001@yahoo.com.cn

          010-82776427

          語境

          在基于異步通信方式的系統中,實現模塊的同步調用。

          問題

          消息隊列已經成為目前很多軟件選用的通訊方式,消息模式使得不同分布式組件間的耦合性較為松散,提高了系統的可維護性和可擴充性。但是有時我們希望在這種情況下能夠模擬同步的調用方式,希望能夠通過一個組件透明的幫我們實現這種異步和同步調用的轉換。

          解決方案

          p1.jpg
          圖表
          1 基于消息的分布式系統

          上圖是一種常見的基于消息的分布系統結構,系統中包含兩條隊列。命令隊列用于傳送模塊間相互調用的命令對象,響應隊列用于傳送命令處理后的響應結果對象。

          在通常情況下消息隊列上的模塊會以異步的方式工作,這種情況下模塊通常不關心命令執行后的狀況,常常是不須返回值的。

          為了模擬同步調用我們通過一個 SynProxy 組件來幫助我們完成由異步到同步調用的模擬。使得 Client 對其他模塊的調好像是同步的一樣。

          SynProxy 組件的結構如下:

          p2.jpg
          圖表
          2 SynProxy 的靜態結構

          SynProxy: 組織完成異步到同步調用的轉換

          WaitingQueue: 存放還未獲得執行返回值的 Command 對象

          UIDCreator: 產生能夠唯一標示每個 Command 對象的 UID

          ResponseReceiver: 監聽響應隊列中的響應消息,它在獨立的線程中運行

          Command :命令對象

          Response :響應對象p3.jpg

          ?

          圖表 3 將異同步調用轉化成同步調用的過程

          部分解釋: ( 以上以在 JAVA 環境中為例 )

          Wait 表示調用 Command wait 方法阻塞住當前線程

          Command 執行模塊在執行了響應操作后生產 Response 對象用于放回結果, Response 對象中的 UID 屬性應該與處理的 Command UID 的值相同

          Notify 表示調用 Command notify 方法喚醒被阻塞的線程

          上面過程中的 wait 設置了阻塞的超時時間(來自于 Command 對象的屬性值)

          posted on 2006-11-10 17:28 超越巔峰 閱讀(1499) 評論(0)  編輯  收藏 所屬分類: Design Pattern

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 潮州市| 江安县| 平邑县| 勐海县| 文化| 虹口区| 凤阳县| 老河口市| 武平县| 尉氏县| 宜黄县| 新建县| 开原市| 交口县| 雅江县| 遵化市| 新营市| 嘉禾县| 札达县| 河北区| 湖北省| 尼木县| 浦城县| 罗定市| 祥云县| 凌海市| 吉水县| 丘北县| 泾川县| 门头沟区| 呼和浩特市| 会理县| 雅江县| 久治县| 丰台区| 乡城县| 高要市| 莒南县| 四平市| 新巴尔虎右旗| 新民市|