gpt4 book ai didi

scala - Akka 主管捕获 future 的失败

转载 作者:行者123 更新时间:2023-12-03 20:23:09 26 4
gpt4 key购买 nike

我正在尝试使用 Futures 和 Akka 主管开发应用程序,但是当 future 向 Actor 返回失败时,其主管没有收到异常。

这是我的代码。

1) 监督 Actor

class TransaccionActorSupervisor() extends Actor with ActorLogging {

val actor: ActorRef = context.actorOf(Props[TransaccionActor].withRouter(RoundRobinPool(nrOfInstances = 5)), "transaccion-actor")

def receive = {
case msg: Any => actor forward msg
}

override val supervisorStrategy = OneForOneStrategy() {
case exception =>
println("<<<<<<<<<<<<<<<<<<< IN SUPERVISOR >>>>>>>>>>>>>>>>>>>>>>>>>>>>")
Restart
}

}

监制 Actor
Class TransaccionActor() extends Actor with ActorLogging {

implicit val _: ExecutionContext = context.dispatcher
val transaccionAdapter = (new TransaccionComponentImpl with TransaccionRepositoryComponentImpl).adapter

def receive = {

case msg: GetTransaccionById =>
val currentSender: ActorRef = sender()
transaccionAdapter.searchTransaction(msg.id).onComplete {
case Success(transaction) => currentSender ! transaction
case Failure(error) => throw error
}

}

我究竟做错了什么?

非常感谢大家!

最佳答案

我遇到了同样的问题,Ryan 的回答确实有帮助。但是因为我是 Akka 的新手,所以理解答案并非易事,所以我想提供一些细节。

首先,我认为onComplete根本行不通。它只是注册可以在完全独立的线程中调用的回调函数,并且不会返回新的 Future .所以在 onComplete 内抛出的任何异常会迷路。

相反,最好使用 map , recover , recoverWithtransform当他们返回新的 Future s。然后你需要将结果通过管道传输给一个 Actor ,例如self ;接收者必须处理管道结果并重新抛出异常。

换句话说,你的监督 Actor 应该是这样的:

import akka.pattern.pipe
import akka.actor.Status.Failure
import akka.actor.Actor

class TransaccionActor() extends Actor with ActorLogging {

import context.dispatcher

val transaccionAdapter =
(new TransaccionComponentImpl with TransaccionRepositoryComponentImpl).adapter

def receive = {

case msg: GetTransaccionById =>
val currentSender: ActorRef = sender()
transaccionAdapter searchTransaction msg.id map { transaction =>
currentSender ! transaction
} pipeTo self

case Failure(throwable) => throw throwable

}

}

关于scala - Akka 主管捕获 future 的失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27537367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com