Безопасно ли для аккера Акка стать методом закрытия над неизменным состоянием?

Цель здесь - реализовать очень простой кэш для актера, которому необходимо вызвать внешнюю службу (или некоторую дорогостоящую, но очень кэшируемую операцию) без использования изменяемого состояния.

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].