Подтвердить что ты не робот

Акка Актер спрашивает и печатает

Как я могу использовать Akka Actor и поддерживать безопасность типа? или избегать использования запроса в пользу сообщений?

При вызове ? или ask в Акке Акка возвращается Future[Any], и я должен сделать явное приведение через future.mapTo[MyType].

Мне не нравится потерять этот тип безопасности. Если я использую Futures напрямую (без актеров), я могу явно вернуть Future[MyType] и поддерживать безопасность типов.

В моем конкретном случае использования актер делегирует это сообщение двум дочерним субъектам, а затем агрегирует результаты этих участников и возвращает их родительскому отправителю. Метод моего родительского метода похож на этот подход в Документах Akka:

http://doc.akka.io/docs/akka/2.0/scala/futures.html#For_Comprehensions

val f1 = actor1 ? msg
val f2 = actor2 ? msg

val f3 = for {
  a ← f1.mapTo[Int]
  b ← f2.mapTo[Int]
  c ← ask(actor3, (a + b)).mapTo[Int]
} yield c

Есть ли лучший способ добиться моего использования?

4b9b3361

Ответ 1

Попробуйте типизированные участники. В основном они позволяют вам взаимодействовать с актером, используя строго типизированные черты/интерфейсы, а не путем обмена сообщениями. За кулисами Akka реализует эти интерфейсы с динамическим прокси и делает асинхронную магию.

Типированный актер может возвращать методы с разными, сильно типизированными возвращаемыми значениями (из документации, упомянутой выше):

def squareDontCare(i: Int): Unit //fire-forget

def square(i: Int): Future[Int] //non-blocking send-request-reply

def squareNowPlease(i: Int): Option[Int] //blocking send-request-reply

def squareNow(i: Int): Int //blocking send-request-reply

Этот метод представляет tell, а остальные - разные вкусы ask.

Ответ 2

Я хотел опубликовать новый ответ, потому что @Roland Kuhn недавно представила новое решение для этого типа Typed Channels:

val f: Future[MyType] = actor <-?- message