2017-12-19 12 views
0

にフューチャー内のオブジェクトを取得するために、私は以下のような将来の応答のための別のmyActor2を依頼するアッカmyActor1を使用します。がどのようにScalaの

case class Person(name: String, age: Int) 

val future = myActor2 ? request 
val result = Await.result(future, timeout.duration).asInstanceOf[Person] 

だが、結果はこのようなケースクラスであるとしましょう

私はAwait.resultを使用しないようにプロセスをブロックしたくありません。

val future = (myActor2 ? request).mapTo[Person] 

今未来は未来である[人]といない未来の[任意]: は、このように私は以下のコードを持っています。 未来に含まれる人物を抽出して例外を処理する方法はありますか? 私はonCompleteで何かを試しましたが、成功は人だけでなくIntを受け入れるようです。私は以下のようなものを望みます:

future onComplete { 
    case Success(result) => result 
    case Failure(failure => doSomethingOnFailure(failure) 
} 

ご存知ありがとうございますか?

+1

2人の俳優の間でコミュニケーションをしているときは、決して尋ねるべきではありません。 tellを使用して、応答メッセージを聞きます。 –

+1

'pipe'関数をチェックしましたか? https://doc.akka.io/docs/akka/current/actors.html?language=scala#ask-send-and-receive-future – mfirry

+2

モナドのコンテキストから値を抽出することはできませんが、内部で作成することはできません。 – cchantep

答えて

1

別のメッセージを処理することで、応答の処理が必要になります。他の俳優からの返信を考慮しても問題がなければ、tell!)でリクエストを送信して、レスポンスの受信メソッドにケースを追加するだけで十分でしょう。

パラレルリクエストとレスポンスが混乱しないようにする必要がある場合は、一度に1件のリクエストしか飛行できないように、becomeStashを使用してください。もちろん、これがシステムのスループットを制限することを認識してください。

あなたは何とかreceiveハンドラに渡す前に応答を「翻訳」したい場合は、pipeパターンが便利になるかもしれません:

import akka.pattern.pipe 

... 
    val someIdentifier = ??? 
    (myActor2 ? request) 
     .map(response => MyCommandWith(response, someIdentifier)) 
     .pipeTo(self) 

これは、askの結果を収集し、それをマッピングしてから送信します。それは現在の俳優へのメッセージとして(self)。しかし、マップ関数でアクターの状態を閉じないように注意してください!

あなたがメッセージの元の送信者によって行われるように取り扱い、さらに結果やエラーをしたい場合は、まったくpipeを必要としませんが、あなたはforwardの代わりaskを使用することができます。

0

PersonFuture[Person]を変換する魔法はありません。あなたは結果を抽出またはコードリターンFuture[Smth]のこの部分を作成し、呼び出し側に結果の抽出を委任するために、この未来にAwaitを呼び出すことのいずれかがあります。

関連する問題