Try/Success/Failure 在 Scala As 中的序列化
Serialization of Try/Success/Failure in Scala Akka
我正在尝试 ask
一个会回复 Try 的演员:
val reply = actor.ask[Try[MyReply]](MyCommand)
然而,当回复来自集群中另一个节点上的参与者时,我在日志中收到以下错误:
Failed to serialize message [scala.util.Success].
有趣的是,如果我使用 Option
而不是 Try
,事情似乎工作正常。我想使用 Try
来更好地控制错误。有没有办法通过 Try
?
实现这一点
我认为这是 akka 的开发人员故意这样做的,以避免使用 Try
作为传输类型。
Try
旨在处理所有非致命异常。这将要求您序列化异常,以便它们通过网络传输并在其他节点上处理。 Imo,必须在本地处理异常。
如果您想转移您的业务错误,我建议您改用 Either[MyError, MyReply]
,其中 MyError
可以是您自己的 case class
定义特定业务错误。
编辑:
正如@artur 所建议的,您还可以使用 akka.pattern.StatusReply 来通知返回错误消息。
case class Command(replyTo: ActorRef[StatusReply[MyReply]])
val actorRef: ActorRef[Command] = ???
actorRef.askWithStatus(Command).onComplete {
case Success(response) =>
case Failure(StatusReply.ErrorMessage(text)) => ???
case Failure(_) => ???
}
我正在尝试 ask
一个会回复 Try 的演员:
val reply = actor.ask[Try[MyReply]](MyCommand)
然而,当回复来自集群中另一个节点上的参与者时,我在日志中收到以下错误:
Failed to serialize message [scala.util.Success].
有趣的是,如果我使用 Option
而不是 Try
,事情似乎工作正常。我想使用 Try
来更好地控制错误。有没有办法通过 Try
?
我认为这是 akka 的开发人员故意这样做的,以避免使用 Try
作为传输类型。
Try
旨在处理所有非致命异常。这将要求您序列化异常,以便它们通过网络传输并在其他节点上处理。 Imo,必须在本地处理异常。
如果您想转移您的业务错误,我建议您改用 Either[MyError, MyReply]
,其中 MyError
可以是您自己的 case class
定义特定业务错误。
编辑:
正如@artur 所建议的,您还可以使用 akka.pattern.StatusReply 来通知返回错误消息。
case class Command(replyTo: ActorRef[StatusReply[MyReply]])
val actorRef: ActorRef[Command] = ???
actorRef.askWithStatus(Command).onComplete {
case Success(response) =>
case Failure(StatusReply.ErrorMessage(text)) => ???
case Failure(_) => ???
}