Акка Актер спрашивает и печатает
Как я могу использовать 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
Есть ли лучший способ добиться моего использования?
Ответы
Ответ 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