如何使用Akka Java从非演员类的接待员访问演员?[closed]

uoifb46i  于 2022-11-05  发布在  Java
关注(0)|答案(3)|浏览(166)

已关闭。此问题需要更多的focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

去年关闭了。
此帖子已于去年编辑并提交审核,但未能重新打开:

需要详细信息或澄清添加详细信息并通过editing this post澄清问题。

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

unguejic

unguejic1#

谢天谢地,我可以用Java AKKA和接待员提出通用和优雅的解决方案!!

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;
            });
}
5f0d552i

5f0d552i2#

它看起来像这样(如果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和friends)来提取Receptionist.Listing并采取适当的操作。

qcbq4gxm

qcbq4gxm3#

下面是Akka与参与者系统之外的参与者进行交互的文档。
Java有一个选项卡。
https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#request-response-with-ask-from-outside-an-actor

相关问题