2011-02-12 117 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