Следует отметить, что ни один из ваших примеров не создает актера: это работа ActorSystem
. В примерах определены акторы.
Первый метод определения актера - это нетипизированный API-интерфейс "classi c".
Второй метод - это один из двух API для типизированных акторов (в частности, API "функционального" стиля).
В документах Akka сказано:
Для новых проектов мы рекомендуем использовать новые [типизированные] API-интерфейсы Actor.
API-интерфейсы classi c по-прежнему полностью поддерживаются и, вероятно, будут долгое время.
Существует также API в стиле OO для определения типизированного субъекта:
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 classi c полностью документирован, например, Документы Akka для актеров .
Типизированные API позволяют компилятору проверять, по крайней мере, некоторые протоколы обмена сообщениями. Если у вас есть ActorRef[Foo]
, вы можете отправлять актеру только сообщения размером Foo
с (включая подтипы Foo
). Также возможно проверить, что поведение актера охватывает все сообщения, которые он мог бы получить.