scala - 在 Akka 中创建演员的首选方式是什么?
问题描述
我正在尝试创建基本的演员,Akka
但我发现了两种不同的方法来创建演员。一种方法是扩展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 官方网站上没有提到它。请解惑。
解决方案
应该注意的是,您的两个示例都没有创建演员:这是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]
你只能将Foo
s(包括 的子类型Foo
)的消息发送给演员。还可以验证参与者的行为是否涵盖了它可能收到的所有消息。
推荐阅读
- r - 是否有一个 R 函数来连接由 geom_() 对象创建的分组数据点?
- python - Python。在循环中填充数组
- c# - 如何让方法在不阻塞的情况下返回已启动的任务?
- amazon-rds - Aurora Mysql 中的最大并发 LOAD FROM S3 请求数
- c++ - c ++在cgo中访问外部
- python - 检查名称列表中是否存在构建名称 -python
- python - 在二维数组中将列表中的每个元素相乘时出错
- python - 将线条形状更改为聚合图
- java - 为什么 negate() 需要显式强制转换为 Predicate?
- javascript - 如何从 javascript 访问打印对话窗口中的元素