首页 > 解决方案 > Akka 从演员那里得到 ComletedStage 的回应

问题描述

我指的是api

Patters.ask(actor, msg, duration); 这是样本

class MyActor extends AbstractBehavior{
    interface Command{}
    interface SomeMessage implements Command{ INSTANCE}
    public Reveive<Comamnd> receive(){
       return newReceiveBuilder().onMessage(SomeMessage.class, this::someMessage).build();
    }
    private Behavior<Command> someMessage(SomeMessage ref){
       System.out.println("Dru lalal");
    }
}


 ActorRef<MyActor.Command> myActor = ...;
 Future<Object> future = Patterns.ask(myActor, SomeMessage.INSTANCE, Duration.ofMillis(10000));

什么是对象?

显然这不会编译。图片的某些部分丢失了,但 javadoc 没有说明是什么。调用“Patterns.ask”假设返回带有对象的未来,这些值由参与者作为业务逻辑提供。但是actor中没有业务逻辑。我假设假设有某种约定或映射方法返回值与“Patters.ask”触发的值。

反向逻辑也是如此。我将无法定义接收器,因为它希望返回 Receiver 而不是 SomeObject,因此,api 不想让我将结果绑定到某些消息。我唯一能做的就是手动传递 ComputableFuture

ComputableFuture<MyOBject>  future = new ComputableFuture<>();
myActor.tell(new Message(future));

    private Behavior<Command> someMessage(Message message){
         var result = compute();
         message.future.comlete(result);
    }

在这里,我已经手动管理所有内容,还有传递不可序列化消息、对象生命周期等问题。

标签: akka

解决方案


使用了错误的对象。我使用经典的“Patterns.ask”,而不是新的 java 类型 dsl 的“AskPattern.ask”。

大多数时候,新的 api 对象具有相同的对象名称但位于不同的包中。我曾经只检查包名称,因为在 IDE 中玩它们时它们总是彼此相邻,因为名称是相同的。在玩 api 时,我习惯于忽略经典的“com.akka”对象。

在这里我陷入了陷阱,对象名称不同,并且没有放在“经典”包对象旁边的IDE中。


推荐阅读