我正在尝试实现一个调度程序参与者,它要么处理请求,要么在失败的情况下将处理委托(delegate)给另一个参与者(实际上它是指数退避算法)。调度程序参与者有一个 bool 变量,用于决定如何路由处理。
保持 Actor 的某种状态是否正确?可能会出现什么问题?我应该使用交易者 (akka) 还是 STM 来避免出现问题? (我使用的是akka actor)
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
}
}
最佳答案
Actor 应该维护状态,但如果它们仅响应消息或内部生成的操作而更改状态,那么最容易推理它们;如果其他实体希望它们改变状态,它们应该发送消息。
对于你的情况,我会改变
def otherMethod { backoff = true }
到,在接收内,
case BeginBackoff => backoff = true
并让要调用 otherMethod 的人发送 BeginBackoff
。 (如果您需要优先处理退避消息,您应该使用其他人已经演示过的两级接收,例如回答您之前有关参与者的问题。)
关于Scala 参与者和共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981352/