Scala 如果将来的调用失败,则使参与者失败

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

我正在执行未来调用中的某些操作。我将在成功完成后将结果返回给发送方,或者如果将来的调用失败,将使参与者失败。这将由实施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

问题在于,
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
,而不是将其添加到当前接收。