Scala 如果将来的调用失败,则使参与者失败
我正在执行未来调用中的某些操作。我将在成功完成后将结果返回给发送方,或者如果将来的调用失败,将使参与者失败。这将由实施RoundRobinPool和主管策略的母公司处理 下面是代码片段Scala 如果将来的调用失败,则使参与者失败,scala,akka,Scala,Akka,我正在执行未来调用中的某些操作。我将在成功完成后将结果返回给发送方,或者如果将来的调用失败,将使参与者失败。这将由实施RoundRobinPool和主管策略的母公司处理 下面是代码片段 private def getData(sender: ActorRef): Unit = { dao.getData().mapTo[List[Data]].map(result => sender ! result) .onFailure { case e: Nul
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问题在于,
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)
}
你所说的“让参与者失败”是什么意思?将它传播回用户并杀死参与者。导致主管重新启动参与者的行为。作为监管者策略。在出现空指针异常的情况下,在监管者中使用Restart。更重要的是,当我从未来函数外部显式抛出错误时,或者即使没有
通过接收状态。Failure(ex)来恢复,它为什么会起作用
由pipeTo
提供的消息。在我未来的实际通话中,我仍然能够保留地图,对吗?@user520209,您只需要在receive方法中添加一个case,该方法接受在未引发异常的情况下返回的结果类型。我的意思是,如果将来调用成功,我是否仍然可以直接将结果发送到map pf中的发送方,如问题中所示,无需将结果通过管道传递给self。@user520209您可以添加一个映射,该映射将消息传递给发件人,但之后仍然会将结果发送给您自己。用管道把它传给你自己,然后把它传给发送者会更干净。如果需要,您可以使用been
,而不是将其添加到当前接收。