Akka Typed 中的 Behaviors.setup 和 Behaviors.receive 有什么区别?

What is the difference between Behaviors.setup and Behaviors.receive in Akka Typed?

我有时会在 Akka 教程中看到

Behaviors.setup { ctx =>
 ...

 Behaviors.receiveMessage[String] { msg =>
  ... // some operations with ctx and message  
 }

}

有时只是

Behaviors.receive[String] { (ctx , msg) =>
  ... // some operations with ctx and message  
}

有什么区别?

传递给 Behaviors.setup 的函数 (ActorContext[String] => Behavior[String]) 在生成 actor 时执行,无论是否有消息要处理。

传递给 Behaviors.receive 的函数 ((ActorContext[String], String) => Behavior[String]) 在有消息要处理之前不会执行。

请注意,如果您有

Behaviors.setup { ctx =>
  // code block A

  Behaviors.receiveMessage[String] { msg =>
    // code block B
  }
}

Behaviors.receive[String] { (ctx, msg) =>
  // code block A
  // code block B
}
Behaviors.receive 中的

code block A 将对每条消息执行(除非并直到 code block B 安装了新的 Behavior)。