2011-02-12 129 views
2

我想實現一個調度員演員,要麼處理請求,要麼委託處理另一個演員在失敗的情況下(實際上是指數退避算法)。調度員actor有一個布爾變量,用於決定如何路由處理。斯卡拉演員和共享狀態

在演員中維護一些狀態是否正確?會發生什麼問題?我應該使用交易者(akka)還是STM來避免問題? (我用阿卡演員)

class DispatcherActor extends Actor { 

    var backoff = false 

    def receive = { 
    case SendMessage(registrationId, message) => { 
     if (backoff) { 
     //put on the queue 
     backoffManagerActor ! AddMessageToQueue(message) 
     } else { 
     httpClient.sendNotificationToClient(message, this) 
     } 
    } 
    case BackoffCompleted => //set backoff to false 
     backoff = false 
    } 

    def otherMethod = { 
     backoff=true 
    } 
} 
+2

您應該_never_將您的actor實例傳遞給其他代碼,這違反了演員模型。傳遞「自我」參考(ActorRef)併發回消息。 – 2011-02-13 20:54:47

回答

4

演員應該保持狀態,但最簡單的方法來思考他們,如果他們只更改響應消息或自己內部產生的行動是狀態;如果其他實體希望他們改變狀態,他們應該發送消息。

在你的情況,我會改變

def otherMethod { backoff = true } 

於內收到,

case BeginBackoff => backoff = true 

,並有誰正想打電話otherMethod發送BeginBackoff來代替。 (如果您需要優先處理退避消息,則應該使用兩級接收其他人已經演示的內容,例如迴應您之前關於演員的問題。)

+0

其實otherMethod是在httpclient執行的請求完成(nio)時調用的方法。這是一個傾聽者的方法。我正在使用異步HTTP客戶端。那麼我應該用消息傳遞來替換偵聽器方法嗎?演員是否按順序或同時處理消息?謝謝 – Matroska 2011-02-13 00:17:34