2015-07-11 74 views
0

我是新来的阿卡,我使用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

感谢。

+0

这是一个重复的问题,你的回答是正确的,但请记住,如果你想保持反应而不是等待未来这个问题的答案显示如何做到这一点:http:// stackoverflow。 COM /问题/ 25408311 /如何到使用 - 阿卡 - 期货 - 异步式的Java – Snickers3192

回答

0

我解决它通过这种方式:

private ActorRef caller = null; 

inside onReceive() : 
if (message instanceof CountReq) { 
    this.caller = getSender(); 
    remote.tell(message, getSelf()); 
} 
if (message instanceof CountRes) { 
    caller.tell(message , getSelf()); 
} 

我不知道,如果它的“标准”的方式,但至少它的工作原理。

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