Смешивать обычные вызовы методов с сообщениями при использовании актеров? - PullRequest
2 голосов
/ 11 марта 2012

Я пишу кометное приложение в лифте, и некоторые из моих актеров имеют ссылки на других акторов, например, у пользователя A есть актер B, в котором есть переменная, хранящая актора C, который связан с пользователем D.

Некоторыедействия пользователя A должны привести к тому, что их субъект B отправит сообщение субъекту C.

Эти действия инициируются пользователем A.

Мой вопрос в том, можно ли вызывать обычные методы длясубъект B, в результате чего он отправляет сообщение C, или я должен вместо этого отправлять сообщение A, которое он получает, а затем отправляет сообщение B.

Чтобы поместить его в код, это такая вещьok:

//in some snippet:
val actorB: ActorB = session.map(.findCometActor(...))
"#some-button" #> SHtml.ajaxInvoke(() => actorB.sendIt(777)) //is this ok?

//the actors:
case class MyMessage(someInt: Int, someString: String)
class ActorB extends CometActor {
  private var someString = ""
  private var otherActor: Box[CometActor] = Empty

  def sendIt(someInt: Int) = otherActor ! MyMessage(someInt, someString)
}
class ActorC extends CometActor {
  def lowPriority = {
    case MyMessage(num, str) => println(num + str)
  }
}

Или если код фрагмента отправляет сообщение субъекту B, который затем отправит сообщение субъекту C вместо непосредственного вызова actorB.sendIt(777)?

Редактировать: Просто чтобы подтвердить, что с этим нет никаких технических проблем, речь идет больше о стиле и, надеюсь, облегчает корректировку кода.Это правильно?

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

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

1 голос
/ 11 марта 2012

Не называйте это напрямую - даже если это выглядит хорошо, что на самом деле это не так. Если вы собираетесь получить доступ к someString, вы должны каким-то образом защитить его с помощью блокировки, а это не так.

В общем, с актерами, используйте парадигму актеров. Это остается в парадигме, которая делает ваш код легко рассуждать ... это не так просто рассуждать, и чем сложнее, тем хуже будет. Отправьте сообщение B, которое скажет B отправить сообщение C, как вы указали.

...