我尝试在 homepet 项目中使用 akka-typed,但不知道如何正确找到演员或生成并发送消息。 我的第一次尝试:从接待员那里包装“列表”并通过适配器发送 - 非常冗长并且需要始终为演员佩戴命令 第二次尝试:创建函数“tellToXXX”
private Behavior<Command> tellToWorker(ServiceKey<Worker.Command> serviceKey, Worker.Command command) {
record WrappedFindResult(Receptionist.Listing listing, Throwable failure) implements Command {
}
var system = getContext().getSystem();
getContext().pipeToSelf(
AskPattern.ask(
system.receptionist(),
replyTo -> Receptionist.find(serviceKey, replyTo),
Duration.ofSeconds(1),
system.scheduler()),
WrappedFindResult::new);
return Behaviors.receive(Command.class)
.onMessage(WrappedFindResult.class, result -> {
result.listing().getServiceInstances(serviceKey).stream().findFirst()
.orElseGet(() -> getContext().spawnAnonymous(Worker.create()))
.tell(command);
return this;
}).build();
}
如何纠正这个? 谢谢
假设您的演员是唯一会产生工人演员的演员(暗示:工人是本地的),您无需费心向接待员注册:建立一个
Map<ServiceKey<Worker.Command>, ActorRef<Worker.Command>>
并将其保存在演员中充足的。然后当你需要一个工人时,在ServiceKey
中查找Map
:如果没有,则产生并保存在演员中。如果只有一个ServiceKey
,那么Optional<ActorRef<Worker.Command>>
就可以了。
此外,如果有多个 worker 都在做同样的工作,routers 可能值得考虑:你生成一个 actor 并向它发送消息;演员将它们转发给它管理的工人池(其行为由您提供)。