Типа безопасных актеров Скала - PullRequest
12 голосов
/ 28 апреля 2011

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

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

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

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

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

  • огонь-и-забудь
  • запрос-ответ
  • запрос-ответ-с-будущим
0 голосов
/ 03 ноября 2014

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

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

0 голосов
/ 28 апреля 2011

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

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

...