【问题标题】:How to access actors from receptionist in non-actor classes using Akka Java? [closed]如何使用 Akka Java 从非演员类中的接待员访问演员? [关闭]
【发布时间】:2021-10-04 14:03:10
【问题描述】:

我有不同的actors作为Akka系统的一部分运行,具有不同的类型。如何使用接待员从具有 System 对象的非演员类中找到演员。我没有直接引用或任何方式将引用传递给非参与者类。

【问题讨论】:

    标签: java akka


    【解决方案1】:

    谢天谢地,我可以使用 Java AKKA 和 Receptionist 提出通用且优雅的解决方案!

    private <T> CompletableFuture<ActorRef<T>> findActor(ActorSystem<Void> system, ServiceKey<T> actorKey) {
        ActorRef<Command> receptionist = system.receptionist();
        Duration askTimeout = Duration.ofSeconds(3);
        CompletionStage<Listing> result = AskPattern.ask(
                receptionist,
                replyTo -> Receptionist.find(actorKey, replyTo),
                askTimeout,
                system.scheduler());
    
        return result.toCompletableFuture().thenApplyAsync(
                (reply) -> {
                    if (reply != null && reply instanceof Listing) {
                        return reply.getServiceInstances(actorKey).stream().findFirst().get();
                    }
                    return null;
                }).exceptionally((Throwable ex) -> {
                    return null;
                });
    }
    

    【讨论】:

    • 感谢您的回答,您知道空集可能被退回的任何原因吗?有没有办法检查演员是否真的在接待员那里注册?
    • 这是一个很好的问题@PyWalker2797。我没有遇到任何关于接待员的信息,如果演员被注册为接待员作为演员,您唯一能做的就是异步询问/告知。
    • 我认为你可以使用日志记录,我使用 log4j,设置 = 调试它会在演员向接待员注册时记录
    【解决方案2】:

    它看起来像(如果 Java 很糟糕,请道歉):

    // TargetActor.Command is just a placeholder
    ActorSystem<Void> system;
    ServiceKey<TargetActor.Command> key;
    
    CompletionStage<Receptionist.Listing> result =
        AskPattern.ask(
            system.receptionist(),
            replyTo -> Receptionist.find(key, replyTo),
            Duration.ofSeconds(10),  // ask will fail if no reply received in this time
            system.scheduler()
        );
    

    然后您可以使用常用的CompletionStage 方法(例如whenComplete 和朋友)提取Receptionist.Listing 并采取适当的措施。

    【讨论】:

    • 我更新了问题,使其更加专注于解决单个问题。我希望现在可以更清楚地重新操作。
    【解决方案3】:

    这里是 Akka 与 Actor 系统之外的 Actor 交互的文档。

    Java 有一个标签。

    https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#request-response-with-ask-from-outside-an-actor

    【讨论】:

    • 本文档未包含任何关于接待员的信息
    • @saumilsdk - 公平点。我确实从Akka 找到了这个例子,看来你想出了一个类似的解决方案。 github.com/akka/akka/blob/main/akka-actor-typed-tests/src/test/…
    • 还有一件事是我可以以同步的方式为参与者和非参与者类使用通用解决方案。我发现我的解决方案现在对于查找不同类型的演员非常有用。如果您愿意,请随时支持我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2021-05-16
    • 2023-04-06
    • 2013-11-22
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多