Как мне сделать так, чтобы классический актер стал и неприличным в типизированном актере

#scala #akka #akka-actor #akka-typed

Вопрос:

Я создаю реализацию, и я хотел бы изменить поведение. Как мне переключиться между тремя видами поведения и обратно? Мои проблемы в том, что я не знаю правильного способа изменить поведение, а затем изменить его обратно на основное поведение после обработки этого сообщения. Я уже пробовал это

 
    def answerMachine: Behavior[Message] = Behaviors.setup{ context: ActorContext[Message] =>
    Behaviors.receiveMessage{
      case s@Behave =>
        println("Am told to behave: changing like chameleon")
        EchoMachine(s, Behaviors.same)
      case Back() =>
        println("Now am back")
        Behaviors.same
    }
  }


def EchoMachine(firstMsg: Message, behav:  Behavior[Message]): Behavior[Message] = Behaviors.setup{ context: ActorContext[Message] =>
    Behaviors.receiveMessage {
      case Back() =>
        println("I have changed to EchoMachine..")
        behav
      case Behave =>
        println("I am behaving oo")
        behav
    }
  }


val system = ActorSystem(TypedConvo.answerMachine, "Machine")

system.ref ! Behave
system.ref ! Back()

 

К тому времени, когда я отправил Back() , я ожидал answerMachine , что получу сообщение, но это была эхомашина даже после изменения поведения.

Спасибо.

Ответ №1:

become В типизированных актерах нет, потому что каждый раз возвращается новое поведение. По сути become , вызывается каждый раз, когда обрабатывается сообщение, и именно так поддерживается состояние. Таким образом, ответ на вопрос, как «переключаться между тремя видами поведения», состоит в том, чтобы просто вернуть то, какое поведение требуется в данный момент.

Проблема с примером кода заключается в том, что возврат Behaviours.same означает «не меняйте поведение». Таким образом, установка behav в Behaviours.same означает, что EchoMachine возвращается Behaviours.same то, что сохраняет поведение как EchoMachine , а не возвращается answerMachine .

Попробуйте установить behav значение answerMachine :

 Behaviors.receiveMessage{
  case s@Behave =>
    println("Am told to behave: changing like chameleon")
    EchoMachine(s, answerMachine)
  case Back() =>
    println("Now am back")
    Behaviors.same
}
 

Теперь EchoMachine сообщение вернется answerMachine в виде нового поведения после обработки сообщения. Конечно, если EchoMachine всегда возвращаться к answerMachine этому, можно просто вернуться answerMachine .

Комментарии:

1. Спасибо, в этом есть смысл