如何将actor收到的消息返回给java?

时间:2015-07-11 04:28:20

标签: java akka actor

我是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

感谢。

1 个答案:

答案 0 :(得分:0)

我通过这种方式解决它:

.page

我不知道它是否是标准&#39;方式,但至少它是有效的。

欢迎任何更好的解决方案!