Что плохого в том, как я использую akka unbecome


Есть класс scala (из курса Coursera reactive)

class Counter extends Actor {
   def counter(n: Int): Receive = {
    case "inc" => context.become(counter(n + 1))        
    case "get" => sender ! n
  }

  def receive = counter(0)
}

Все, что делает этот актер, - это увеличивает счетчик по запросу inc и возвращает текущее значение счетчика через запрос get. Я думал, что это контекст.become добавляет новое поведение в стек поведения. Поэтому, если я добавлю строку

    case "dec" => context.unbecome()

Он восстановит предыдущее поведение из стека и в дальнейшем get-запрос вернет Предыдущее значение. Но если я побегу

counter ! "inc"
counter ! "inc"
counter ! "inc"
counter ! "inc"

counter ! "dec"
counter ! "get"

Возвращаемый результат равен 0, но не 3, Как я ожидал. Мог ли кто-нибудь опишите, почему?

1 2

1 ответ:

Ваш вызов become отменяет предыдущее поведение, так как значение по умолчанию для второго аргумента, discardOld, равно true. Это поведение по умолчанию предназначено для предотвращения утечек памяти.