11

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

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,但在某些情况下确实不是必需的。

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

4

1 回答 1

13

据我所知,这种技术是合理的,应该适合您使用。这实际上是一种更聪明的方式来避免var response在你的代码中有一个可变的。我实际上在这里的答案中使用了这种技术,来自 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]

于 2013-09-30T19:31:35.033 回答