【发布时间】:2021-10-04 14:03:10
【问题描述】:
我有不同的actors作为Akka系统的一部分运行,具有不同的类型。如何使用接待员从具有 System 对象的非演员类中找到演员。我没有直接引用或任何方式将引用传递给非参与者类。
【问题讨论】:
我有不同的actors作为Akka系统的一部分运行,具有不同的类型。如何使用接待员从具有 System 对象的非演员类中找到演员。我没有直接引用或任何方式将引用传递给非参与者类。
【问题讨论】:
谢天谢地,我可以使用 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;
});
}
【讨论】:
它看起来像(如果 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 并采取适当的措施。
【讨论】:
这里是 Akka 与 Actor 系统之外的 Actor 交互的文档。
Java 有一个标签。
【讨论】:
Akka 找到了这个例子,看来你想出了一个类似的解决方案。 github.com/akka/akka/blob/main/akka-actor-typed-tests/src/test/…