Akka从actor获得响应为completedstage



我指的是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"假设用对象返回future,这些值由actor作为业务逻辑提供。但是actor中没有业务逻辑。我想应该有某种约定或映射的方法返回值与什么" patterns。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);
}

现在我们开始,我手动管理一切,还有传递不可序列化消息的问题,对象的生命周期等等。

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

大多数情况下,新的api对象具有相同的对象名称,但位于不同的包中。我过去只检查包的名字,因为在IDE中玩的时候,他们总是在一起,因为名字是一样的。我已经习惯了忽略经典的"com.akka"

这里我陷入了陷阱,对象名称不同并且没有放在IDE中"classic"旁边包对象。

最新更新