Каков предпочтительный способ создания актеров в Акке? - PullRequest
2 голосов
/ 27 января 2020

Я пытаюсь создать основных c Актеров в 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. Пожалуйста, просветите.

1 Ответ

3 голосов
/ 27 января 2020

Следует отметить, что ни один из ваших примеров не создает актера: это работа 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). Также возможно проверить, что поведение актера охватывает все сообщения, которые он мог бы получить.

...