2017-02-08 15 views
1

今後の呼び出しで何かを実行しています。私は成功した完了時に結果を送付者に返すか、または将来の呼びかけが失敗した場合に俳優を失敗させます。スーパバイザ戦略を適用したRoundRobinPoolが実装されている親によって処理されます。未来の呼び出しが失敗した場合にアクターに失敗する

ここにコードスニペットがあります。

private def getData(sender: ActorRef): Unit = { 

    dao.getData().mapTo[List[Data]].map(result => sender ! result) 
     .onFailure { 
     case e: NullPointerExcetpion => { 
      println("+++++++ Throwing exception") 
     // throwning the exception from here doesn't cause the supervisor to restart this actor 
      throw t 
     } 
     } 

     // throwing the exception from here makes the supervisor strategy to take action 
     throw new NullPointerExcetpion 

    } 

未来が例外を返す場合、俳優を失敗させるにはどうすればいいですか?

乾杯、

UTSAV

+0

あなたは「俳優の失敗」とはどういう意味ですか? –

+0

それをユーザーに伝播させて、俳優を殺します。スーパーバイザーがアクターを再起動させるような動作。ヌルポインタ例外の場合、SupervisorStrategy.Restartがスーパーバイザで使用されるため。 – Utsav

+0

もっと重要なのは、Future関数の外部から明示的にエラーを投げているときに、なぜそれが機能しているのですか? – Utsav

答えて

1

問題がonFailureコールバックが俳優が実行されているものを任意のスレッドからスロー、とされていないということです。あなたが行うことができますパイプは、自分自身に結果であり、その後、スロー:

case class MyFailure(e: Throwable) 

def receive: { 
    case MyFailure(e) => throw e 
} 

private def getData(sender: ActorRef): Unit = { 
    dao 
    .getData() 
    .mapTo[List[Data]] 
    .recover { 
    case e => MyFailure(e) 
    } 
    .pipeTo(self) 
} 

それとも@jrudolphとして

が提案:

def receive: { 
    case Status.Failure(e) => throw e 
} 

private def getData(sender: ActorRef): Unit = { 
    dao 
    .getData() 
    .mapTo[List[Data]] 
    .pipeTo(self) 
} 
+1

また、 'pipeTo'によって提供される' Status.Failure(ex) 'メッセージを受け取ることによって' recover'がなくても。 – jrudolph

+0

@jrudolph追加されました。 –

+0

実際の将来のコールでマップを保持することはできますか? – Utsav

関連する問題