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(_) => ???
}