如何:常见模式

    详见「Actor Timers」。

    从 Java 进入 Actor 世界的一个好方法是使用Patterns.ask()。这个方法启动一个临时 Actor 来转发消息,并从 Actor 那里收集要“询问”的结果。如果所请求的 Actor 中出现错误,则将接管默认的监督处理。Patterns.ask()的调用方将不会收到通知。

    如果调用者对这种异常感兴趣,他们必须确保被询问的 Actor 以Status.Failure(Throwable)进行答复。在被询问的 Actor 之后,可能会生成一个复杂的 Actor 层次结构来完成异步工作。然后监督是控制错误处理的既定方法。

    此模式提供了一种将监督和错误传播封装到临时 Actor 的方法。最后,由Patterns.ask()返回的承诺作为一个失败来实现,包括异常,详见「 」。

    让我们看一下示例代码:

    askOf方法中,会向SupervisorCreator发送用户消息。SupervisorCreator创建一个SupervisorActor并转发消息。这可以防止由于 Actor 创建而导致 Actor 系统过载。监督者负责创建用户 Actor、转发消息、处理 Actor 终止和监督。此外,如果执行时间过期,则监管者将停止用户 Actor。

    最后,我们能够执行一个 Actor 并接收结果或异常。

    1. /*
    2. * Copyright (C) 2018-2019 Lightbend Inc. <https://www.lightbend.com>
    3. */
    4. package jdocs.pattern;
    5. import akka.actor.ActorRef;
    6. import akka.actor.ActorRefFactory;
    7. import akka.actor.Props;
    8. import akka.util.Timeout;
    9. import scala.concurrent.duration.FiniteDuration;
    10. import java.time.Duration;
    11. import java.util.concurrent.CompletionStage;
    12. import java.util.concurrent.TimeUnit;
    13. public class SupervisedAskSpec {
    14. public Object execute(
    15. Object message,
    16. ActorRefFactory actorSystem)
    17. throws Exception {
    18. // example usage
    19. try {
    20. ActorRef supervisorCreator = SupervisedAsk.createSupervisorCreator(actorSystem);
    21. CompletionStage<Object> finished =
    22. SupervisedAsk.askOf(supervisorCreator, Props.create(someActor), message, timeout);
    23. return finished.toCompletableFuture().get(timeout.toMillis(), TimeUnit.MILLISECONDS);
    24. } catch (Exception e) {
    25. // exception propagated by supervision
    26. throw e;
    27. }
    28. }

    Lagom 框架」编码了将 Akka 持久性和 Akka 持久性查询与集群分片相结合的许多最佳实践,以构建具有事件源和 CQRS 的可扩展和弹性系统。

    请参见 Lagom 文档中的「」和「持久性实体」。