大家好。 我有一些关于在一个参与者到另一个参与者的消息中设置 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()
调用来处理。