ric*_*din 5 java scala actor akka
我正在开发一个应用程序,该应用程序创建一些Akka actor来管理和处理来自Kafka主题的消息。具有相同密钥的消息由同一参与者处理。我还使用消息键来命名相应的演员。
当从该主题中读取新消息时,我不知道id是否等于消息密钥的actor是否已经由actor系统创建。因此,我尝试使用其名称来解析actor,如果尚不存在,则创建它。我需要在参与者解决方面管理并发性。因此,可能有多个客户询问参与者系统是否存在参与者。
我现在使用的代码如下:
private CompletableFuture<ActorRef> getActor(String uuid) {
return system.actorSelection(String.format("/user/%s", uuid))
.resolveOne(Duration.ofMillis(1000))
.toCompletableFuture()
.exceptionally(ex ->
system.actorOf(Props.create(MyActor.class, uuid), uuid))
.exceptionally(ex -> {
try {
return system.actorSelection(String.format("/user/%s",uuid)).resolveOne(Duration.ofMillis(1000)).toCompletableFuture().get();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
});
}
Run Code Online (Sandbox Code Playgroud)
上面的代码未经过优化,可以使异常处理更好。
但是,在Akka中,是否存在一种更惯用的方式来解决演员,或者如果演员不存在则创建演员?我想念什么吗?
ActorRef考虑创建一个参与者,将消息 ID 到s的映射作为其状态进行维护。这个“接待员”参与者将处理所有请求以获取消息处理参与者。当接待员收到对参与者的请求(该请求将包括消息 ID)时,它会尝试在其映射中查找关联的参与者:如果找到这样的参与者,则将其返回ActorRef给发送者;否则,它会创建一个新的处理参与者,将该参与者添加到其映射中,并将该参与者引用返回给发送者。