不处理消息的 Akka(类型化)actor Behavior 的类型是什么?
What is the type of an Akka (Typed) actor Behavior that handles no messages?
假设我正在为 Akka(类型化)actor 定义一个行为,它将执行并发计算,将其结果报告给生成它的 actor,然后停止。
如果我使用计算的所有输入以及对其“父级”的引用来初始化此 actor,那么它将永远不需要接收任何类型的传入消息。
我将使用 Behaviors.setup
创建此行为,向其传递一个执行计算的函数,然后 returns Behaviors.stopped
.
Akka(Typed)要求我为 return 此行为的函数提供某种 Behavior[T]
的结果类型。虽然我可以将行为将发送的结果消息的类型分配给 T
,但这似乎不正确。 T
不是为了限制 actor 可以接收的消息吗?因此,如果我根据参与者将发送的消息类型定义 T
,我不是在向编译器“撒谎”吗?
事实上,此行为不能 - 也不会 - 处理任何传入消息。
是否有更正确的类型可以分配给此行为?
或者我是否遗漏了类型化演员行为的要点?
示例:
在下面的代码中,我的 apply
returns Behavior[ Result ]
,但这是一个谎言。它永远不会接收或处理 Result
消息。 (它只会发送一个。)
import akka.actor.typed.{ ActorRef, Behavior }
import akka.actor.typed.scaladsl.Behaviors
object ConcurrentComputation {
sealed trait Result
final case class Success( result : Double ) extends Result
final case class Failure( exception : Throwable ) extends Result
def apply(
argX : Double,
argY : Double,
parent : ActorRef[ Result ]
) : Behavior[ Result ] = Behaviors.setup(
context => {
try {
Success( compute( argX, argY ) )
}
catch {
case e : Throwable => Failure( e )
}
Behaviors.stopped
}
)
// Never mind what's actually being done.
def compute( x : Double, y : Double ) : Double = ???
}
到目前为止,我想到的最好的是 Behavior[ Any ]
。
这是错误的语义,因为它表达了与代码意图相反的意思。
实际上,我认为它不会损害代码执行,因为行为不能处理任何消息。
欢迎更好的回答。
一般来说,它用于Behaviors.setup[Nothing]表示没有收到任何消息的行为。假定演员会收到消息,但有时他们不会。例如,当您在 Akka Typed 中创建一个 ActorSystem 时,您需要为用户监护人 actor 提供一个 Behavior,该 actor 不会接收任何消息,您为该 actor 创建行为为 Behavior[Nothing].
此类型表示此 actor 无法接收任何消息,因为“不存在此类型的实例”(Nothing 类型)。
假设我正在为 Akka(类型化)actor 定义一个行为,它将执行并发计算,将其结果报告给生成它的 actor,然后停止。
如果我使用计算的所有输入以及对其“父级”的引用来初始化此 actor,那么它将永远不需要接收任何类型的传入消息。
我将使用 Behaviors.setup
创建此行为,向其传递一个执行计算的函数,然后 returns Behaviors.stopped
.
Akka(Typed)要求我为 return 此行为的函数提供某种 Behavior[T]
的结果类型。虽然我可以将行为将发送的结果消息的类型分配给 T
,但这似乎不正确。 T
不是为了限制 actor 可以接收的消息吗?因此,如果我根据参与者将发送的消息类型定义 T
,我不是在向编译器“撒谎”吗?
事实上,此行为不能 - 也不会 - 处理任何传入消息。
是否有更正确的类型可以分配给此行为?
或者我是否遗漏了类型化演员行为的要点?
示例:
在下面的代码中,我的 apply
returns Behavior[ Result ]
,但这是一个谎言。它永远不会接收或处理 Result
消息。 (它只会发送一个。)
import akka.actor.typed.{ ActorRef, Behavior }
import akka.actor.typed.scaladsl.Behaviors
object ConcurrentComputation {
sealed trait Result
final case class Success( result : Double ) extends Result
final case class Failure( exception : Throwable ) extends Result
def apply(
argX : Double,
argY : Double,
parent : ActorRef[ Result ]
) : Behavior[ Result ] = Behaviors.setup(
context => {
try {
Success( compute( argX, argY ) )
}
catch {
case e : Throwable => Failure( e )
}
Behaviors.stopped
}
)
// Never mind what's actually being done.
def compute( x : Double, y : Double ) : Double = ???
}
到目前为止,我想到的最好的是 Behavior[ Any ]
。
这是错误的语义,因为它表达了与代码意图相反的意思。
实际上,我认为它不会损害代码执行,因为行为不能处理任何消息。
欢迎更好的回答。
一般来说,它用于Behaviors.setup[Nothing]表示没有收到任何消息的行为。假定演员会收到消息,但有时他们不会。例如,当您在 Akka Typed 中创建一个 ActorSystem 时,您需要为用户监护人 actor 提供一个 Behavior,该 actor 不会接收任何消息,您为该 actor 创建行为为 Behavior[Nothing].
此类型表示此 actor 无法接收任何消息,因为“不存在此类型的实例”(Nothing 类型)。