【问题标题】:What is the preferred way to create actors in Akka?在 Akka 中创建演员的首选方式是什么?
【发布时间】:2020-05-12 08:24:57
【问题描述】:

我正在尝试在 Akka 中创建基本的 Actor,但我发现了两种不同的创建 Actor 的方法。一种方法是扩展akka.actor.Actor trait 并实现receive 方法,如下所示

import akka.actor.Actor

class HelloActor extends Actor {
  override def receive: Receive = ???
}

另一种方法是使用对象并实现apply()方法,如下所示:

final case class GreetedMessage(whom: String, from: ActorRef[GreetMessage])
final case class GreetMessage(whom: String, replyTo: ActorRef[GreetedMessage])

object GreeterActor {
  def apply(): Behavior[GreetMessage] = Behaviors.receive { (context, message) =>
    context.log.info("Hello {}!", message.whom)
    message.replyTo ! GreetedMessage(message.whom, context.self)
    Behaviors.same
  }
}

我想知道创建演员的首选方式以及可能的原因。

我假设扩展 Actor 特征是旧方法,因为 Akka 官方网站上没有提到它。请赐教。

【问题讨论】:

    标签: scala akka actor


    【解决方案1】:

    应该注意的是,您的两个示例都没有创建演员:这是ActorSystem 的工作。这些示例定义了参与者。

    第一个定义actor的方法是“经典”的无类型Actor API。

    第二种方法是用于类型化 Actor 的两个 API 之一(特别是“函数式”样式 API)。

    Akka 文档说:

    对于新项目,我们建议使用新的 [typed] Actor API。

    仍然完全支持经典 API,并且可能会持续很长时间。

    还有一个 OO 风格的 API 用于定义类型化的 Actor:

    class GreeterBehavior(context: ActorContext[GreetMessage]) extends AbstractBehavior[GreetMessage](context) {
      override def onMessage(message: GreetMessage): Behavior[GreetMessage] = {
        context.log.info("Hello {}!", message.whom)
        message.replyTo ! GreetedMessage(message.whom, context.self)
        this
      }
    }
    

    编辑添加:经典 API 已完整记录,例如Akka docs for Actors.

    类型化 API 允许编译器验证至少某些消息传递协议。如果你有ActorRef[Foo],你只能向actor发送Foos(包括Foo的子类型)的消息。还可以验证参与者的行为是否涵盖了它可能收到的所有消息。

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多