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
类型,它可以是Left
或Right
。Left
通常包含一个错误,而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的错误的?*
谢谢
1条答案
按热度按时间ifsvaxew1#
StatusReply
旨在作为参与者协议的成功/错误响应的良好编码,参见文档:https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#generic-response-wrapper