我在Java Web应用程序中有一个分层架构. UI层只是Java,服务是类型化的Akka actor,外部服务调用(WS,DB等)包含在Hystrix命令中.
UI调用服务,服务返回Akka未来.这是Akka的未来,因为我希望使用Akka期货提供的onComplete和onFailure回调来简化UI编码.然后,该服务创建执行某些映射等的未来,并将调用包装回返回Java未来的HystrixCommand.
所以在伪代码中:
UI
AkkaFuture future = service.getSomeData();
服务
public AkkaFuture getSomeData() {
return future {
JavaFuture future = new HystrixCommand(mapSomeData()).queue()
//what to do here, currently just return future.get()
}
}
问题是我想释放服务主角正在使用的线程,并且只是绑定Hystrix使用的线程.但是java的未来会阻止它,因为我必须阻止它的完成.我能想到的唯一选择(我不确定自己喜欢)是不断轮询Java未来,并在Java未来完成时完成Akka的未来.
注意:问题与Hystrix本身并没有真正的关系,但如果有人想出一个与Hystrix特别相关的解决方案,我决定提一下.
解决方法:
但是:也许,而不是轮询(如上面的讨论所示),Hystrix提供某种onComplete回调?我根本不知道图书馆,但偶然发现了onComplete in the Hystrix API.也许它有帮助吗?
标签:java,asynchronous,akka,future
来源: https://codeday.me/bug/20190613/1230127.html