Akka类型的Java错误

e5nqia27  于 2022-11-05  发布在  Java
关注(0)|答案(1)|浏览(135)

Akka文档对 * 验证错误 * 和 * 失败 * 进行了区分。但是,虽然有一个关于失败的完整章节,但我没有看到太多关于验证错误的内容。
验证错误意味着发送给参与者的命令数据无效,这应该作为参与者协议的一部分建模,而不是使参与者引发异常。
--https://doc.akka.io/docs/akka/current/typed/fault-tolerance.html中的一个
我搜索了一下,但仍然无法找到关于这个主题的太多信息。

选项1,类型层次结构:

我们可以使用一个类型层次结构来拥有一个类型化结构一个命令、他的成功回答和错误之间的联系:

class MyCommand { 
   ActorRef<MyCommandAnswer> replyTo;
   // .. 
}
interface MyCommandAnswer { }
class MyCommandSuccess implements MyCommandAnswer { /* .. */ }
class MyCommandError implements MyCommandAnswer { /* .. */ }

👍 好的一面是,命令和两个可能的答案之间有很强的关系。
👎 然而,这是冗长的,并且答案的类型不是显而易见的(我们必须读取类型层次结构来发现可能的类型)。此外,答案必须用instanceof或类似于访问者的模式来处理(这不会减少冗长性)。

选项2,类似Either

Scala有一个Either类型,它可以是LeftRightLeft通常包含一个错误,而Right包含一个成功。还有Try使用相同的模式。
表示两个可能类型之一的值(不相交联合)。Either的示例是scala.util.Left或scala. util. Right的示例。
-- https://www.scala-lang.org/api/2.13.3/scala/util/Either.html
我们可以创建一个类似的类型,它将由我们的参与者进行答复。

abstract class Either<L, R> {
  public static <L> Either<L, ?> left(L error) {
    return new Left(error);
  }
  public static <R> Either<?, R> right(R value) {
    return new Right(value);
  }

  public abstract boolean isLeft();
  public abstract boolean isRight();
  public abstract <O> Either<L, O> map(Function<R, O> mapping);
  public abstract <O> O orElse(Supplier<O> other);
  // ...
}

class MyCommand {
  ActorRef<Either<MyCommandError, MyCommandSuccess>> replyTo;
  // ..
}

👍 好的方面是我们总是知道可能的答案,并且Either类可以在所有参与者之间重用。这使得在项目中的使用更容易。我们可以有许多该类型的方法来处理这两种情况,而不必为所有命令重复代码。
👎 这是一段受功能启发的代码,可能对每个人来说都不太自然。
我的偏好显然是Either类型。但是我希望有社区关于这个主题的知识。
所以,我的问题是,* 你是如何管理Akka类型和Java的错误的?*
谢谢

ifsvaxew

ifsvaxew1#

StatusReply旨在作为参与者协议的成功/错误响应的良好编码,参见文档:https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#generic-response-wrapper

相关问题