Безопасно ли для аккера Акка стать методом закрытия над неизменным состоянием?
Цель здесь - реализовать очень простой кэш для актера, которому необходимо вызвать внешнюю службу (или некоторую дорогостоящую, но очень кэшируемую операцию) без использования изменяемого состояния.
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
}
}
Я знаю, что есть более продвинутые способы его реализации, среди которых полноценная CacheSystem, которая может быть найдена на страницах шаблонов Akka, но в некоторых случаях это действительно не требуется.
Плюс, интересно узнать ответ, если использование станет таким, что это безопасно.
Ответы
Ответ 1
Насколько я знаю, эта техника звучит и должна быть хорошей для вас. На самом деле это более умный способ обойтись, имея в своем коде mutable var response
. Я использовал эту технику в ответе здесь, и Виктор из команды Akka, похоже, думал, что это хорошее решение. Однако одно можно изменить:
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]
.