在我的任務中,父演員創建一些子演員并向他們發送訊息
def apply(): Behavior[CreateBranch] = {
Behaviors.receive { (context, message) =>
val child1 = context.spawn(Child(), "child1")
val child2 = context.spawn(Child(), "child2")
val child3 = context.spawn(Child(), "child3")
context.children.foreach {
child ! Child.SomeMessage
{
}
}
子actor定義為:
object Child {
sealed trait SomeMessage
def apply():Behavior[SomeMessage] = {
// some behaviour
{
}
但是運算式“context.children”不起作用:孩子定義為 Iterable[ActorRef[Nothing]] 而不是 Iterable[ActorRef[Child.SomeMessage]]
在有關“context.children” ActorContext.children 的檔案中
“當目的是向他們發送訊息時,這不是查找孩子的有用方法。”
這份檔案提出了另一種實作方式——但它大約有 30 行代碼!
有沒有其他替代方式來實作廣播訊息發送?
uj5u.com熱心網友回復:
一般來說,沒有辦法保證子actor的靜態型別(父actor和監護actor ( context.system)也是如此)。
但是,如果您完全確定所有孩子都會接受該資訊,您可以
context.children.foreach { child =>
child.unsafeUpcast[Child.SomeMessage] ! Child.SomeMessage
}
顧名思義,這是不安全的,并且允許您在不保證孩子會處理它們的情況下發送訊息。由于 Akka Typed 的實作Behavior涉及執行訊息強制轉換的經典 actor,因此兩者之間的不匹配Behavior會ActorRef導致 actor 立即失敗。 unsafeUpcast(至少從發件人的角度來看......)比強制轉換更安全asInstanceOf,因為這至少可以保證您實際上是在!呼叫ActorRef.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/434744.html
上一篇:瀏覽器多標簽會話問題
