Leo*_*tis 1 scala akka akka-typed
假设我正在为 Akka(类型化)actor 定义一个行为,它将执行并发计算,将其结果报告给生成它的 actor,然后停止。
如果我使用计算的所有输入以及对其“父级”的引用来初始化此参与者,那么它将不需要接收任何类型的传入消息。
我将使用 创建此行为Behaviors.setup,向其传递一个执行计算的函数,然后返回Behaviors.stopped。
Behavior[T]Akka(Typed)要求我为将返回此行为的函数提供一些结果类型。虽然我可以分配T行为将发送的结果消息的类型,但这似乎不正确。不是T要限制演员可以接收哪些消息吗?因此,如果我T根据参与者将发送的消息类型进行定义,我不是在向编译器“撒谎”吗?
事实上,此行为不能 - 也不会 - 处理任何传入消息。
是否有更正确的类型可以分配给此行为?
或者我是否在某种程度上错过了演员行为类型的要点?
在下面的代码中,我的applyreturns 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 = ???
}
Run Code Online (Sandbox Code Playgroud)
一般来说,它用于不\xc2\xb4t接收任何消息的行为的Behaviors.setup[Nothing] 。假设参与者会收到消息,但有时他们不会\xc2\xb4t。例如,当您在 Akka Typed 中创建 ActorSystem 时,您需要为用户监护 Actor 提供一个Behavior,该 Actor 不会接收任何消息,并且您为该 Actor 创建行为为Behaviour[Nothing]。
\n该类型表示该actor无法接收任何消息,因为“不存在该类型的实例”(Nothing类型)。
\n