首页 > 解决方案 > 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() 正在阻塞操作

标签: akka

解决方案


是的,这样做会反过来咬你:使用这种模式,你会阻止一个参与者,直到其他参与者响应,这意味着如果你在程序的其他地方使用它,就会有很高的陷入死锁的风险(即你的整个程序停止并且无法继续)。

Actor 不是使用 Future 来发送响应,而是用于发送消息。在“另一个参与者”中,您应该使用getContext().getSender().tell(response),并且在第一个参与者中,您应该将该响应作为普通消息而不是future.get()调用来处理。


推荐阅读