这里的目的是为需要在不使用可变状态的情况下调用外部服务(或一些昂贵但高度可缓存的操作)的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,但在某些情况下确实不需要。
另外,如果使用变得像这样是安全的,知道答案是有趣的。
答案 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]
的简写别名。