2015-07-11 72 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()); 
} 

我不知道,如果它的「標準」的方式,但至少它的工作原理。

歡迎任何更好的解決方案!