#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. Спасибо, в этом есть смысл