未来在阿卡消息

  • 本文关键字:消息 未来 akka
  • 更新时间 :
  • 英文 :


大家好。 我有一些关于在一个参与者到另一个参与者的消息中设置 CompletableFuture 有多糟糕的问题,并使用 get(( 等待它编译。我有代码示例,我认为在实践中使用起来太复杂了,但找不到任何可参考的论据来建议重构它

发送带有未来的味精的代码

private void onSomeSignal(SomeMsg smsg){
MessageToActor msg = new MessageToActor()
future = new CompletableFuture<>();
msg.setFuture(future);
actortRef.tell(msg, null);
response = future.get(2, TimeUnit.SECONDS);
/* do something with responce*/
}

完成未来的代码(在另一个角色中(

private void onSomeSignal(MessageToActor msg){
response = responseService.getResponse();
msg.getFuture().complete(response);
}

这里有什么问题,除了future.get((正在阻塞操作

是的,这样做会回来咬你:在这种模式下,你会阻止一个Actor,直到其他Actor响应,这意味着如果你在程序的其他地方使用它,则很有可能遇到死锁(即你的整个程序停止并且无法继续(。

不是使用未来来发回响应,而是为发送消息而设计的参与者。在"另一个参与者"中,您应该使用getContext().getSender().tell(response),在第一个参与者中,您应该将该响应作为普通消息而不是future.get()调用来处理。

最新更新