akka - 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);
}
在这里,我已经手动管理所有内容,还有传递不可序列化消息、对象生命周期等问题。
解决方案
使用了错误的对象。我使用经典的“Patterns.ask”,而不是新的 java 类型 dsl 的“AskPattern.ask”。
大多数时候,新的 api 对象具有相同的对象名称但位于不同的包中。我曾经只检查包名称,因为在 IDE 中玩它们时它们总是彼此相邻,因为名称是相同的。在玩 api 时,我习惯于忽略经典的“com.akka”对象。
在这里我陷入了陷阱,对象名称不同,并且没有放在“经典”包对象旁边的IDE中。
推荐阅读
- asset-pipeline - 生产中的 Rails 应用程序找不到 .css 文件
- machine-learning - 错误不匹配 m1 和 m2,我的卷积层计算有什么错误?
- javascript - 从javascript中的字符串替换子字符串
- spring-boot - spring.profile 和 spring.config.activate.on-profile 有什么区别?
- javascript - 使用 javascript 在本地专用网络中发现 Web 服务
- powershell - Powershell Selenium:无法在亚马逊上找到元素
- python - 如何在没有 if/for 的情况下最小化一个数字
- r - 使用R中的echarts在radarchart中渐变颜色
- python - 仅设置某些小部件以随窗口调整大小
- python - Pyamg 不起作用(没有名为“pyamg.amg_core.evolution_strength”的模块)