Актеры Akka и метод aroundReceive () - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь изучить Akka (с Java) и понять некоторый код. Я видел что-то вроде этой сигнатуры метода в классе Actor:

@Override
public void aroundReceive(PartialFunction<Object, BoxedUnit> receive, Object msg)

Я никогда раньше не слышал об этом методе и не понимаю его. Какова цель этого метода? Откуда берется этот аргумент PartialFunction<Object, BoxedUnit> receive? Я думал, что программист должен реализовать объект приема.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Что касается PartialFunction<Object, BoxedUnit>, функция receive в (нетипизированном) актере является примером этого (это совершенно ясно указано в Scala API, и несколько менее в Java API) .

Актер, реализующий это (обычно через миксин Scala или расширение абстрактного класса, который его переопределяет), взял бы функцию receive от актора, реализованного программистом, и перехватил бы вызовы определенных сообщений (например, синхронизирующие сообщения) или выполнять предварительную / постобработку сообщений, которые передаются на заданный receive.

PartialFunction<Object, BoxedUnit> в основном означает:

  • это функция, которая не не обещаю получить результат для любого конкретного ввода; вызывающая сторона обязана заранее проверить (isDefinedAt), будет ли функция иметь результат, или принять, что функция вызовет исключение. (PartialFunction: функция, которая не определена во всей своей области)
  • Object (или в Scala условиях Any (технически AnyRef, но автобокс позволяет нам забыть, что для момент)): функция теоретически может принимать что угодно.
  • BoxedUnit указывает, что функция не возвращает полезного результата (Unit в Scala похоже на void в Java, но на самом деле объект (синглтон, если быть точным)).

(в некоторой степени PartialFunction<Object, BoxedUnit> - это тип, который сообщает нам и компилятору минимум информации).

0 голосов
/ 13 июля 2020

Во-первых, я использую Akka в Scala, а не в Java. Я надеюсь, что этот ответ даст вам подсказку. В Scala это метод @InternalApi. Документация в Scala:

Помечает API, которые считаются внутренними для Akka и могут измениться в любой момент без какого-либо предупреждения. Например, эту аннотацию следует использовать, когда используется ограничение доступа Scala {@code private [akka]}, поскольку Java не имеет возможности представить этот ограниченный доступ к этому пакету, и такие методы и классы представлены как {@code public} в байт-коде

Одна из целей этого метода - обернуть метод приема настраиваемым поведением. Вы можете увидеть пример этого в трейте Timers .

...