据我所知(添加,如果我想念smth)当我们使用Spring MVC
应用程序时,我们有一个来自我们服务器(Tomcat ...)的线程池,当请求来自我们的一个线程来自池处理此请求时,有时这很糟糕,因为如果任务需要很长时间我们的线程将一直忙,为了避免这种行为,我们可以将控制器的返回类型从示例字符串更改为Callable<String>
或DefferedResult<String>
,现在来自tomcat的工作线程从ExecutorService(我们在@Configuration
类中配置)给予线程执行,它更好,因为tomcat线程可以处理其他请求而不会等待每个请求的执行。
但我不明白WebFlux的想法。正如我从官方文档中理解的那样,我们有单个线程处理所有请求,然后(我不明白如何)返回响应,但是如果一个请求等待长任务(查询到数据库)是什么意味着这个线程将等到当前任务完成或者它将为此任务创建新线程,如果是这样,它如何与Callable和DefferedResult不同?
提前感谢
答案 0 :(得分:0)
此视频:
https://www.infoq.com/presentations/servlet-reactive-stack
解释了如何在servlet和反应堆栈中处理请求以及响应式方法的好处。
还有很好的解释为什么 RxJava (另一个反应库)优于期货:
http://reactivex.io/intro.html
Java Futures等技术可以直接用于单一 异步执行的级别,但他们开始添加非平凡的 它们嵌套时的复杂性。
很难使用Futures来最佳地构成条件 异步执行流程(或不可能,因为每个的延迟 请求在运行时有所不同)。当然,这可以做到,但很快就会完成 变得复杂(因而容易出错)或过早地阻塞 Future.get(),它消除了异步执行的好处。
另一方面,ReactiveX Observables用于撰写 流和异步数据序列。