context.become 改变了 Akka Actor 的行为

Posted

技术标签:

【中文标题】context.become 改变了 Akka Actor 的行为【英文标题】:context.become changes the behaviour of Akka Actor 【发布时间】:2017-07-19 21:09:00 【问题描述】:

我正在学习如何使用 context.become 来控制我的演员的状态,我正在使用以下代码:

class MyActor extends Actor 

  override def receive: Receive = 
     println("Happens here")
     active(Set.empty)
   

  def active(isInSet: Set[String]): Receive = 
    case Add(key) =>
      context.become(active(isInSet+key))
    case Contains(key) =>
      sender() ! isInSet(key)
    case ShowAll =>
      println(isInSet.toSeq)
  



case class Add(key: String)
case class Contains(key: String)
object ShowAll


object DemoBecome extends App

override def main(args: Array[String]): Unit = 

 val system = ActorSystem("BecomeUnbecome")
 val act = system.actorOf(Props(classOf[MyActor]), "demoActor")

 act ! Add("1")
 act ! ShowAll
 act ! Add("2")
 act ! ShowAll

 Thread.sleep(10000)
 System.exit(0)


当我发送第一条消息时,“接收”工作并打印消息,在第二条消息不显示后,这是我的输出:

Happens here
Set()
Vector(1)
Set(1)
Vector(1, 2)

如果我更改接收方法,为此:

def receive = 
  case a: Add => println("happens here Add" )
  case c: Contains => println("happens here Contains")
  case ShowAll => println("happens here Show")

我收到这个输出:

happens here Add
happens here Show
happens here Add
happens here Show

所以我尝试跟踪“接收”被“阻止”的时刻,但我没有成功,我的疑问是:当我在我的演员中使用 context.become 时,Akka 如何以及何时处理之后的消息第一个?

【问题讨论】:

这不是我得到的:scastie.scala-lang.org/6IdNU8IUTQyj4ZEmyZGStg 【参考方案1】:

当您使用context.become 时,您正在改变演员的行为。这意味着,当参与者使用默认的receive 行为启动它时。但是,当它收到一条消息时,它会打印消息Happens here 并使用部分函数active 来处理它。

因为在active 内部调用context.become(active(_)),actor 的行为发生了变化。从现在开始,当一条消息被发送给actor时,它将执行部分函数active而不是receive方法,这就是为什么你不会在输出中多次看到Happens here

【讨论】:

感谢您的详细解释!后续问题 - 那么我们如何改变行为,以便在演员的后续消息中再次调用接收? 您可以使用context.unbecome 或再次致电contest.become(receive)。对于第二个选项,您需要小心,因为您可能会泄漏资源。官方文档很好地解释了这一切:doc.akka.io/docs/akka/current/actors.html#become-unbecome

以上是关于context.become 改变了 Akka Actor 的行为的主要内容,如果未能解决你的问题,请参考以下文章

Actor初识

Akka源码分析-Cluster-DistributedData

将 Akka 与现有 java 项目集成的示例

akka-typed - EventSourcedBehavior in action

akka-typed - EventSourcedBehavior in action

akka学习教程(十三) akka分布式