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