欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > javascript >内容正文

javascript

java异步处理-凯发k8官方网

发布时间:2024/10/8 javascript 0 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 java异步处理_springboot异步开发之异步请求,在高并发的情况下,提高性能 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在servlet 3.0之前,servlet采用thread-per-request的方式处理请求,即每一次http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行io操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待**io操作完成, 而io操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。其请求流程大致为:

而在servlet3.0发布后,提供了一个新特性:异步处理请求。可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。其请求流程为:

随着spring5发布,提供了一个响应式web框架:spring webflux。之后可能就不需要servlet容器的支持了。以下是其先后对比图:

注意:异步请求时,可以利用threadpoolexecutor自定义个线程池。

在spring中,有多种方式实现异步请求,比如callable、deferredresult或者webasynctask。每个的用法略有不同,可根据不同的业务场景选择不同的方式。以下主要介绍一些常用的用法

控制台输出:

超时、自定义线程设置

从控制台可以看见,异步响应的线程使用的是名为:mvcasync1的线程。第一次再访问时,就是mvcasync2了。若采用默认设置,会无限的创建新线程去处理异步请求,所以正常都需要配置一个线程池及超时时间。

编写一个配置类:customasyncpool.java

自定义一个超时异常处理类:customasyncrequesttimeoutexception.java

同时,在统一异常处理加入对customasyncrequesttimeoutexception类的处理即可,这样就有个统一的配置了。

之后,再运行就可以看见使用了自定义的线程池了,超时的可以自行模拟下:

相比于callable,deferredresult可以处理一些相对复杂一些的业务逻辑,最主要还是可以在另一个线程里面进行业务处理及返回,即可在两个完全不相干的线程间的通信。

控制台输出:

注意:返回结果时记得调用下setresult方法。

题外话:利用deferredresult可实现一些长连接的功能,比如当某个操作是异步时,我们可以保存这个deferredresult对象,当异步通知回来时,我们在找回这个deferredresult对象,之后在setresult会结果即可。提高性能。

使用方法都类似,只是webasynctask是直接返回了。觉得就是写法不同而已

控制台输出:

主要是讲解了异步请求的使用及相关配置,如超时,异常等处理。设置异步请求时,记得不要忘记设置超时时间。

喜欢的小伙伴,点个关注吧!

总结

以上是凯发k8官方网为你收集整理的java异步处理_springboot异步开发之异步请求,在高并发的情况下,提高性能的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图