我是akka的新手,我使用akka作为RPC服务。我知道akka不止于此,但这是我开始的地方。
有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);
}
请遵循以下示例:An Akka actors 'ask' example
我写了一个客户:
@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代码示例或示例项目,并将结果传递给非actor社区?
环境:2个SpringBoot应用程序,akka-actor_2.11版本2.3.11
感谢。
答案 0 :(得分:0)
我通过这种方式解决它:
.page
我不知道它是否是标准&#39;方式,但至少它是有效的。
欢迎任何更好的解决方案!