Определение метода получения актера Akka - PullRequest
0 голосов
/ 13 мая 2018

Из документации Akka :

Актеры реализуются путем расширения базовой черты Actor и реализации метода receive. Метод receive должен определять серию операторов case (которые имеют тип PartialFunction[Any, Unit]), которые определяют, какие сообщения может обрабатывать ваш Actor, используя стандартное сопоставление с образцом Scala, а также реализацию того, как сообщения должны обрабатываться.

Код:

class MyActor extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case "test" ⇒ log.info("received test")
    case _      ⇒ log.info("received unknown message")
  }
}

Нет входных данных для получения, так что же соответствует в операторах case? Кроме того, как PartialFunction[Any, Unit] входит в картину здесь?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Акторы управляются сообщениями, а input подается на актера, как сообщения, отправленные на почтовый ящик . Чаще всего сообщения отправляются актеру через огонь-и-забыв tell (т.е. !), например:

myActor ! "test"

Метод receive в субъекте позволяет сопоставлять шаблоны сообщений (как правило, по типу) для их соответствующей обработки. Метод имеет тип PartialFunction[Any, Unit], поэтому:

  1. case сопоставление с образцом, которое является частичной функцией, хорошо подходит в качестве инструмента проверки для эффективной обработки различных типов входящих сообщений

  2. он может принимать сообщения любого типа, обрабатывать их любым необходимым способом и не должен ничего возвращать, например:

    case i: Int => // do something with i
    case s: String => // do something with s
    // ...
    

Обратите внимание, что в случае необработанных сообщений под капотом в ActorSystem будет опубликовано UnhandledMessage().

0 голосов
/ 13 мая 2018

Сообщение, переданное актеру, соответствует Например: если actor ! "message" вызывается, то "message" совпадает.

см. Здесь

https://alvinalexander.com/scala/how-to-communicate-send-messages-scala-akka-actors

PartialFunction[Any, Unit] входит в рисунок, потому что он принимает аргумент типа Any, но ничего не возвращает. Если "message" передается субъекту, тогда String - это тип параметра, который передается в PartialFunction. Во время сопоставления с шаблоном он не возвращает значение. Так что Unit тип возврата.

...