如何正确找到演员或在原地重生

问题描述 投票:0回答:1

我尝试在 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();
}

如何纠正这个? 谢谢

java akka akka-typed
1个回答
0
投票

假设您的演员是唯一会产生工人演员的演员(暗示:工人是本地的),您无需费心向接待员注册:建立一个

Map<ServiceKey<Worker.Command>, ActorRef<Worker.Command>>
并将其保存在演员中充足的。然后当你需要一个工人时,在
ServiceKey
中查找
Map
:如果没有,则产生并保存在演员中。如果只有一个
ServiceKey
,那么
Optional<ActorRef<Worker.Command>>
就可以了。

此外,如果有多个 worker 都在做同样的工作,routers 可能值得考虑:你生成一个 actor 并向它发送消息;演员将它们转发给它管理的工人池(其行为由您提供)。

© www.soinside.com 2019 - 2024. All rights reserved.