Тип сейфа Scala актеры

Можно ли указать тип сообщения, которое может принять актер, и дать ошибку компиляции, если что-то пытается отправить его другому типу?

Ответ 1

Не уверен, отвечает ли он на ваш вопрос, но я надеюсь, что это даст вам некоторые идеи. Возможно, вы ищете что-то вроде Типированные актеры из Akka проект:

Типизированные актеры реализованы через Типированные актеры. Он использует AOP через AspectWerkz, чтобы превращать обычные POJO в асинхронные неблокирующие актеры с семантикой модели Actor. Например. каждая отправка сообщения преобразуется в сообщение, которое помещается в очередь, которая будет обрабатываться Типированным Актером последовательно один за другим.

Итак, вы определяете интерфейс и реализацию, а затем регистрируете их как актера. Akka создаст прокси для вашего интерфейса, который все еще использует модель актера под капотом. И вы все еще можете использовать следующие стили передачи сообщений:

  • огонь и забыть
  • запрос-ответ
  • request-reply-with-future

Ответ 2

Я думаю, что ответ находится в сообщении, на который ссылается @mkneissl: "Обычная практика заключается в том, чтобы объявить, какие сообщения, которые Актер может получить в сопутствующем объекте Актера, что делает его намного легче узнать, что он может получить".

Пример этого будет полезен...

Ответ 3

В то время как типизированные актеры в какой-то мере решают проблему, вы должны иметь в виду, что это обеспечивает только частичную защиту от статического типа - вы все еще молча выполняете динамический оттиск от нетипизированного актера до введенного в него символом typedActorOf(...) вызов, а также то, что динамическая динамичность и статическая корректность теряются - если базовый реф, оказывается, указывает на актера, который фактически не подчиняется типизированному интерфейсу, у вас есть ошибка; Akka не пытается проверять время исполнения, кто "поддерживает" введенный код, поэтому введенные сообщения заканчиваются отправкой актерам, которые не могут (правильно) ответить на них.

В целом, насколько мне известно, единственный способ достичь полной (?) безопасности статического типа с помощью Akka - использовать типизированные каналы: http://letitcrash.com/post/45188487245/the-second-step-akka-typed-channels.