我是新来的阿卡,我使用akka作为RPC服务。我知道阿卡不止这些,但这是我开始的地方。如何将演员收到的消息返回给java?
有一个UserServiceActor
,报告有多少用户在服务:
@Inject
private UserService userService;
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof CountReq) {
long count = userService.getUserCount();
getSender().tell(new CountRes(count) , getSelf());
}
else {
unhandled(message);
}
}
这UserServiceActor
远程机器上运行。而在本地机器上,还有另一个与远程演员协商的LocalActor
。
if (message instanceof CountReq) {
remote.tell(message, getSelf());
}
if (message instanceof CountRes) {
getSender().tell(message, getSelf());
} else {
unhandled(message);
}
按照这个例子:
我写了一个客户端:
@Inject
private ActorRef localActor;
public long getUserCount() {
Timeout timeout = new Timeout(Duration.create(10, TimeUnit.SECONDS));
Future<Object> future = Patterns.ask(localActor, new CountReq(), 10000);
try {
Object res = Await.result(future, timeout.duration());
logger.info("res = {}" , res);
return (Long) res;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
在1的代码示例只返回一个字符串给发件人,所以非演员的世界可以得到结果。
但在我的情况下,客户端将CountReq
发送给localActor,并且actor将CountReq
发送到远程服务器。远程服务器返回CountRes
。那时,发件人变成了远程UserServiceActor
,而不是非演员客户端。
有些页面建议阅读Futures,但我仍然无法找到如何完成此操作?
是否有任何关于这种RPC式actor的java代码示例或示例项目,并将结果传递给非演员世界?
环境:2 SpringBoot应用,阿卡,actor_2.11版本2.3.11
感谢。
这是一个重复的问题,你的回答是正确的,但请记住,如果你想保持反应而不是等待未来这个问题的答案显示如何做到这一点:http:// stackoverflow。 COM /问题/ 25408311 /如何到使用 - 阿卡 - 期货 - 异步式的Java – Snickers3192