首页 > 解决方案 > 在 Akka 中创建演员的首选方式是什么?

问题描述

我正在尝试创建基本的演员,Akka但我发现了两种不同的方法来创建演员。一种方法是扩展akka.actor.Actortrait 并实现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 官方网站上没有提到它。请解惑。

标签: scalaakkaactor

解决方案


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

定义演员的第一种方法是“经典”无类型演员 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 已完整记录,例如Actors 的 Akka 文档

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


推荐阅读