Я разрабатываю приложение, использующее Akka, и вещь, которая меня беспокоит, все время рассматривает объявление сообщения с помощью Actor
. Где я должен объявлять сообщения? В сопутствующем объекте приемников или сопутствующем объекте отправителей или на каком-то третьем месте?Где должно быть объявлено действие актера?
ответ
Акка команда рекомендует Сообщение должно быть определено в том же месте, метод props
должен быть: in the Receiver's Companion object, поскольку приемник реализует частичную функцию receive
и должен знать обо всех сообщениях, которые он поддерживает. Кроме того, несколько отправителей могут отправлять набор сообщений (реализуемых приемником), поэтому вы не можете поместить его в один отправитель.
Если the official Typesafe Activator template activator-akka-scala-seed имеет какое-то значение в отношении надлежащей практики AKKA в сообщения должны быть частью объекта-компаньона, как показано в следующем PingActor
актера (скопированной непосредственно из шаблона):
package com.example
import akka.actor.{Actor, ActorLogging, Props}
class PingActor extends Actor with ActorLogging {
import PingActor._
var counter = 0
val pongActor = context.actorOf(PongActor.props, "pongActor")
def receive = {
case Initialize =>
log.info("In PingActor - starting ping-pong")
pongActor ! PingMessage("ping")
case PongActor.PongMessage(text) =>
log.info("In PingActor - received message: {}", text)
counter += 1
if (counter == 3) context.system.shutdown()
else sender() ! PingMessage("ping")
}
}
object PingActor {
val props = Props[PingActor]
case object Initialize
case class PingMessage(text: String)
}
Примечание PingActor
, который содержит все (как вы могли заметить, это не соблюдается строго, так как PongActor.PongMessage
также принимается, но не определено в сопутствующем объекте PingActor
).
С другой вопрос How to restrict actor messages to specific types?Viktor said:
Общая практика, чтобы объявить, что сообщения актер может получить в компаньон объекта Актера, что делает его гораздо легче знать, что он может получить.
Фактически этот пример показывает, что типы сообщений могут быть (повторно) использованы для разных участников. Может быть, это хорошая практика поместить сообщения _command_ в сопутствующий объект принимающего актора и сообщения _event_ в другом месте? Здесь 'PingMessage' должен ** не ** находиться в компаньон-объекте' PingActor', потому что этот актер не получает это сообщение. Правильное место - это сопутствующий объект «PongActor». 'PongMessage' должен находиться в приемном объекте-компаньоне PingActor. Но это событие-иш и может быть определено в нейтральном объекте и испускается другими актерами. – Sebastian
@ Себастиан звучит слишком сложно для моего вкуса. Если кто-то спросит вас «где», вы не сможете сразу ответить - давайте использовать простые правила здесь «в компаньоне» легко запомнить и имеет смысл, так как это «парень, который их понимает», подумайте об этом как это «это ребята * протокол *». –
@ Konrad'ktoso'Malawski Мне нравится 3 вещи в вашем комментарии: 1. соглашения, 2. протоколы и 3. обработка объектов/актеров, таких как живые существа _talking_ друг с другом. Но начальный вопрос заключался в следующем: «Где я должен объявлять сообщения? В сопутствующем объекте приемников или сопутствующем объекте отправителей?_ Извините, если я слишком строг, но в приведенном выше примере не очевидно, в каком сопутствующем объекте должны быть объявлены «PingMessage» и «PongMessage». Получающий «PongActor» должен по договоренности понимать «PingMessage» в своем _protocol_, не так ли? ;-) – Sebastian
- 1. hil_message должно быть объявлено
- 2. Почему исключение должно быть объявлено?
- 3. элемент веб-приложение должно быть объявлено
- 4. print_line должно быть объявлено pl/sql error
- 5. Почему значение float должно быть объявлено дважды?
- 6. Должно ли быть состояние актера сериализовано?
- 7. должно быть объявлено вычисленное свойство в модели или контроллере?
- 8. Где должно быть указано #include?
- 9. Где должно быть указано уведомлениеHubClient?
- 10. Значение атрибута должно быть объявлено для свойства типа элемента
- 11. Javac: игнорирование «должно быть объявлено в файле с именем ...»
- 12. Где разрешение должно быть реализовано в MVC4?
- 13. Когда должно быть отмечено действие как асинхронное?
- 14. Symfony2: Ошибка «Свойство уже было объявлено, но оно должно быть объявлено только один раз»
- 15. Где объявлено cout?
- 16. Должно ли threadlocal объявлено как окончательное поле
- 17. должно быть выполнено или должно быть выполнено до того, как произойдет действие, чтобы изменить базу данных?
- 18. Margin/Перетяжка, где не должно быть
- 19. нулевое значение, где не должно быть
- 20. отзывчивое меню не там, где должно быть
- 21. Где должно быть введено каноническое доменное имя?
- 22. Программные петли, где не должно быть
- 23. Кнопка CSS ниже, где должно быть
- 24. Где должно быть установлено приложение: layout_behavior?
- 25. где ".class" объявлено в java?
- 26. Конструктор не может быть применен к заданным типам, и имя должно быть объявлено
- 27. Программно проверить, объявлено ли действие в AndroidManifest.xml
- 28. Ошибка сегментации Не где-то, где должно быть
- 29. Должно быть, должно быть двоичное дерево Хаффмана?
- 30. Touch Down не выполняет действие, которое должно быть
Не могли бы вы продолжить дальше * «Команда Akka рекомендует» *? Будет уместна веб-страница. –
Мы рекомендуем это :-) Добавлена ссылка на документы для ответа Soumya => http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practices –
Спасибо Konrad! –