2017-02-08 71 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

將其傳回給用戶並殺死actor。導致主管重新啓動參與者的行爲。由於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)'消息來恢復。 – jrudolph

+0

@jrudolph已添加。 –

+0

我仍然可以在我未來的實際通話中保留地圖,對吧? – Utsav