【问题标题】:How do i do classic actor become and unbecome in typed actor我如何让经典演员成为和不适合类型演员
【发布时间】:2021-11-16 11:13:22
【问题描述】:

我正在构建一个实现,我想切换行为。如何在三种行为之间切换并返回?我的问题是我不知道更改行为的正确方法,然后在处理该消息后将其更改回主要行为。这个我试过了


    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 会收到消息,但即使在改变行为之后也是 EchoMachine。

谢谢。

【问题讨论】:

    标签: scala akka akka-actor akka-typed


    【解决方案1】:

    类型化的actors中没有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

    【讨论】:

    • 谢谢,有道理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多