Scala演员和共享状态

时间:2011-02-12 23:35:05

标签: scala shared-memory actor akka

我正在尝试实现一个调度程序actor,它可以处理请求,也可以在发生故障时将处理委托给另一个actor(实际上它是指数退避算法)。调度程序actor有一个布尔变量,用于决定如何路由处理。

在演员身上保留一些州是否正确?会发生什么问题?我应该使用交易者(akka)还是STM来避免问题? (我正在使用akka演员)

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
   } 
}

1 个答案:

答案 0 :(得分:4)

参与者应该保持状态,但如果他们只是为了响应消息或内部生成的动作而改变状态,那么最容易推理它们;如果其他实体希望他们改变状态,他们应该发送消息。

在你的情况下,我会改变

def otherMethod { backoff = true }

到,在接收中,

case BeginBackoff => backoff = true

让任何打算调用otherMethod的人发送BeginBackoff。 (如果您需要优先处理退避消息,您应该使用其他人已经证明的两级接收,例如回应您之前关于演员的问题。)