Akka演员成为关闭不可变状态的方法是否安全?

时间:2013-09-30 18:50:53

标签: scala akka actor

这里的目的是为需要在不使用可变状态的情况下调用外部服务(或一些昂贵但高度可缓存的操作)的actor实现一个非常简单的缓存。

class A extends Actor{
  def receive = {
    case GetCommand => 
      val response = callExternalService()
      context.become(receiveWithCache(response))
      context.system.scheduler.schedule(1 day, 1 day, self, InvalidateCache)
      sender ! response
  }
  def receiveWithCache(cachedResponse:R): PartialFunction[Any,Unit] = {
    case GetCommand => sender ! cachedResponse
    case InvalidateCache => context.unbecome
  }
}

我知道有更多高级方法可以实现这一点,其中包括可以在Akka模式页面中找到的完全成熟的CacheSystem,但在某些情况下确实不需要。

另外,如果使用变得像这样是安全的,知道答案是有趣的。

1 个答案:

答案 0 :(得分:13)

据我所知,这种技术很健全,应该对你有好处。实际上,这是一种更聪明的方法,可以在代码中使用可变var response。我在答案中here实际使用了这种技术,Akka团队的Viktor似乎认为这是一个很好的解决方案。但有一件事,你可以改变:

def receiveWithCache(cachedResponse:R): PartialFunction[Any,Unit] = {
  case GetCommand => sender ! cachedResponse
  case InvalidateCache => context.unbecome
}

为:

def receiveWithCache(cachedResponse:R): Receive = {
  case GetCommand => sender ! cachedResponse
  case InvalidateCache => context.unbecome
}

Receive类型是PartialFunction[Any,Unit]的简写别名。