17

Akka Actor Askを使用して型安全性を維持するにはどうすればよいですか?または、tellを優先してaskの使用を避けますか?

Akka Actorを呼び出す?か、または呼び出すと、aが返され、を介して明示的なキャストを実行する必要があります。askFuture[Any]future.mapTo[MyType]

このタイプの安全性を失うのは好きではありません。Futuresを直接(アクターなしで)使用する場合Future[MyType]、型の安全性を明示的に返し、維持することができます。

私の特定のユースケースでは、アクターがメッセージを2人の子アクターに委任し、それらのアクターからの結果を集約して、それを親の送信者に返します。私の親のreceiveメソッドは、AkkaDocsのこのアプローチに似ています。

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

私のユースケースを達成するためのより良い方法はありますか?

4

2 に答える 2

9

@Roland Kuhnが最近、Typed Channelsと呼ばれるこのための新しいソリューションを提示したため、新しい回答を投稿したいと思いました。

val f: Future[MyType] = actor <-?- message
于 2013-03-09T19:05:23.127 に答える
8

タイプされたアクターを試してください。基本的に、メッセージを交換するのではなく、強く型付けされた特性/インターフェースを使用してアクターと対話することができます。舞台裏では、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ます。

于 2012-11-29T18:08:19.950 に答える