之是以叫, 主動對象, 差別于被動對象, 隻能被動被别人調用的對象, 而主動對象内部有線程可以自行調用自己的方法.
active object是一種進階模式, 概念上和rpc有些類似, 但是實作和用途不一樣
active object首先使用了proxy模式, 這個和rpc一樣, 使用者可以象通路local function一樣使用
然後active object關鍵的一步是使用command模式分離invacation和execution, proxy并沒有直接運作調用邏輯, 而是封裝成command發送給invoker queue
active object主要用于異步并發, 而rpc主要用于web service
the active object design pattern decouples method execution from method invocation, which reside in their own threads of control.
the goal is to introduce concurrency and fault tolerance, by using asynchronous method invocation and a scheduler for handling requests.
active object 設計模式的本質是解耦合方法的調用 (method invocation) 與方法的執行 (method execution), 方法調用發生在調用者線程, 而方法的執行發生在獨立于調用者線程的active object線程, 并且這個過程對使用者透明.
在 active object 模式中,主要有以下幾種類型的參與者:
代理 (proxy) :代理是active object所定義的對于調用者的公共接口. 運作時代理運作在調用者線程的上下文中, 負責把調用者的方法調用轉換成相應的方法請求(method request), 并将其插入相應的activation queue, 最後傳回給調用者future對象
方法請求(command):方法請求定義了方法執行所需要的上下文資訊, 諸如調用參數等
activation queue:負責存儲所有由代理建立的, 等待執行的方法請求. 從運作時來看, activation queue會被包括調用者線程及其active object線程并發存取通路, 是以activation queue實作應當是線程安全的
排程者(scheduler):排程者運作在active object線程中, 排程者來決定下一個執行的方法請求, 而排程政策可以基于很多種标準, 比如根據方法請求被插入的順序fifo或者lifo, 比如根據方法請求的優先級等等
implementer: implementer是proxy所定義的接口的事實實作
future: 調用者調用proxy所定義的方法, 獲得future對象. 調用者可以從該future對象獲得方法執行的最終結果. 在真實的實作裡, future對象會保留一個私有的空間, 用來存放implementer方法執行的結果
可以通過以下的方式從future對象獲得真實的執行結果message:
同步等待: 調用者調用future對象的result()方法同步等待, 直到後端的implementer相應方法執行結束, 并把結果存儲到了future對象中來, result傳回, 調用者獲得message
同步逾時等待: 調用者調用future對象的result(timeout)方法. 如果過了timeout時間之後, 後端的implementer相應方法執行仍未結束, 則調用失敗, 否則, 調用者線程被喚醒, result方法傳回, 調用者獲得message
異步查詢: 調用者可以通過調用future對象定義的查詢方法, 檢視真實的結果是否準備好了, 如果準備好了, 調用result方法, 直接獲得message
本文章摘自部落格園,原文釋出日期:2013-11-18