私は Akka 2 で小さなキャッシング アクターを作成しています。アクターがブロックされないようにするために、先物内ですべての計算を実行します。ただし、問題は、このアクターは、それ自体がアクターに含まれていないコードと対話する必要があることです。そのため、「ask」パターンを使用して値を取得する必要があります。
私の質問は、ask パターンを使用するときに、計算の Future を別の Future 内にラップしないようにするにはどうすればよいですか?
例えば
val f = myCache ? GetOrCalc("myKey", myCalculation) // this will be a Future[Future[...]] but I would like a Future[...]
// meanwhile, inside the actor
def receive = {
case GetOrCalc(key, calculation) =>
if (keyNotExists) sender ! Future { calculation() } // calculation() is long-running
else sender ! cacheMap(key)
}
理想的には Future.pipeTo 関数を使用できますが、残念ながらこれは非アクター コードの「応答」としてカウントされません。