当前位置: 首页 > 知识库问答 >
问题:

不处理消息的Akka(类型化)actor行为的类型是什么?

阮喜
2023-03-14

假设我正在为Akka(类型化)执行元定义一个行为,该行为将执行并发计算,将其结果报告给生成它的执行元,然后停止。

如果我用计算的所有输入初始化这个actor,加上对它的“父级”的引用,那么它将永远不需要接收任何类型的传入消息。

我将使用Behaviors.setup创建此行为,向它传递一个执行计算的函数,然后返回Behaviors.Stopped

Akka(Typed)要求我为将返回此行为的函数提供某种行为[T]的结果类型。虽然我可以为t分配行为将发送的结果消息的类型,但这似乎不正确。t不是用来约束参与者可以接收的消息吗?因此,如果我根据参与者将发送的消息类型定义t,我不是在对编译器“撒谎”吗?

事实上,这种行为不能--也不会--处理任何传入的消息。

是否有一个更正确的类型,我可以分配给这个行为?

还是我不知何故错过了类型化演员行为的要点?

在下面的代码中,我的apply返回行为[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 = ???
}

共有2个答案

邢献
2023-03-14

到目前为止,我提出的最好的方法是behavior[Any]

这是糟糕的语义,因为它表达的是代码意图的相反。

实际上,我不认为它会损害代码的执行,因为没有消息可以由行为处理或处理。

更好的答案是受欢迎的。

别旻
2023-03-14

一般情况下,它是使用的行为。对于不接收任何消息的行为设置[Nothing]。假设一个演员接收消息,但有时他们没有。例如,当您创建一个Akka类型的ActorSystem时,您需要为user guardian actor提供一个行为,该actor不会接收任何消息,您将该actor的行为创建为Behavior[Nothing]。

此类型表示此执行元不能接收任何消息,因为“不存在此类型的实例”(Nothing类型)。

 类似资料:
  • 我正在创建一个使用Java+阿卡的演员系统。特别是,我通过提供onReceive()方法的实现来定义非类型化的参与者。 在该方法中,我通过定义接收消息时要执行的逻辑来实现参与者的行为。它可能是: 但是,如果演员只对单一类型的味精感兴趣呢?有没有可能实现选择性接收,使参与者等待某个消息(系统自动重新排队所有其他类型的消息)???

  • 我试图用akka-http测试一个TypedActor,但在尝试创建测试用例时遇到了一些问题。为了测试TypedActor,我将编写以下规范... 但是,当我必须编写一个与HTTP/+WS路由一起使用的TypedActor时,我无法编写... 我如何才能编写一个同时使用这两种测试呢? 请指教。

  • 我正在开发我的flutter应用程序的身份验证。请帮我解决这个问题。我无法识别返回这样一个错误的问题,声明未处理异常:类型列表不是类型字符串的子类型。 以下是登录屏幕的代码: 执行登录的上述代码部分: 错误

  • 更新:感谢@Rjulcaa回答我的地图现在是一个列表,但是列表没有显示在用户界面上。我转过来,我需要用FutureBuilder来处理未来,所以如果有人面临这个问题,记得在你的用户界面主体中添加一个FutureBuilder,并在构建器上返回你想要显示的小部件。 我正在制作一个todo列表教程,我正在尝试添加JSON上的编码功能,我的todoList将其保存在SharedReferences上,当