当前位置: 首页 > news >正文

外国建设小网站赚钱app定制网站建设应有尽有

外国建设小网站赚钱,app定制网站建设应有尽有,编程序可以做网站吗,武侯区建设局网站1、背景 在项目开发中,有一个流程性的方法执行,这个方法会调用各种方法,可能会导致时间比较长 ,如果一直等待响应结果的话,可能会造成超时,如果直接使用异步的方式的话,前端无法知道整体流程什…

1、背景

在项目开发中,有一个流程性的方法执行,这个方法会调用各种方法,可能会导致时间比较长 ,如果一直等待响应结果的话,可能会造成超时,如果直接使用异步的方式的话,前端无法知道整体流程什么时候会结束,

2、解决方案

使用了DeferredResult 的方式,设置超时时间,当流程执行完了没有超过指定时间就可以直接返回结果,如果超过了指定时间就给前端先返回超时结果,并且指定一个唯一标志放到结果中返回,前端后续可以拿着这个唯一标志来轮询,知道返回执行完成

关于 DeferredResult :请求的处理线程(即 tomcat 线程池的线程)不会等DeferredResult#setResult() 被调用才释放,而是直接释放了

也就是说 tomcat 线程安排好 DeferredResult 的一些配置后,不会等逻辑处理完(DeferredResult->setResult()的调用或者超时)。

而是直接释放了,这样 tomcat 线程就被回收到线程池中了,可以响应其他请求,不会傻傻地阻塞等着 DeferredResult->setResult() 被调用或超时。

我们都知道 tomcat 的线程池大小是有限的,如果我们的一些业务逻辑处理慢的话,会渐渐地占满 tomcat 线程,这样就无法处理新的请求,所以一些处理缓慢的业务我们会放到业务线程池中处理,但单纯的放到业务线程池中处理的话,我们无法得知其什么时候处理完,也无法将处理完的结果和之前的请求匹配上,所以常做的方式就是轮询。

而 DeferredResult 的做法就类似仅把事情安排好,不会管事情做好没,tomcat 线程就释放走了,注意此时不会给请求方(如浏览器)任何响应,而是将请求存放在一边,等后面有结果了再把之前的请求拿来,把值响应给请求方。

用简单的话来总结下 Spring DeferredResult :如果返回值类型是 DeferredResult 则表明其是异步请求,tomcat 线程不会等到应用程序处理完或者超时,而是会立即释放线程。

而这个未处理完的请求则会暂存,tomcat 知晓其为异步请求,也不会对客户端进行响应,直至 tomcat 线程扫描到请求超时或者应用线程将 result 塞入到 DeferredResult 中。

3、一些常用方法

public void onTimeout(Runnable callback)

public void onError(Consumer<Throwable> callback)

public void onCompletion(Runnable callback)

public boolean setResult(T result)

  • onTimeout():仅超时触发。
  • onError():仅异步任务抛出异常时触发。
  • onCompletion() 是兜底回调,无论何种结束方式都会执行,适合释放共享资源(如移除缓存、关闭连接)
  • setResult() 设置返回结果集

4、具体简单代码实现

// -1 表示任务未完成 0 表示任务失败 其它是具体值private static final Map<String,String> EXEC_CACHE  = new ConcurrentHashMap<>();@Overridepublic DeferredResult<Map<String, String>> exec() {DeferredResult<Map<String, String>> deferredResult = new DeferredResult<>(5000L);// 设置超时回调(如果任务未在 2 秒内完成,返回超时响应)String flag = UUID.randomUUID().toString();Map<String, String> result = new HashMap<>();deferredResult.onTimeout(() -> {result.put("code", "410");result.put("message", "任务未完成,已超时!");result.put("flag",flag);deferredResult.setResult(result);EXEC_CACHE.put(flag, "-1");});//执行具体任务CompletableFuture.runAsync(()->{try {//模拟执行耗时Thread.sleep(1000);//模拟获到执行结果String execResult = UUID.randomUUID().toString();//放入缓存EXEC_CACHE.put(flag, execResult);//完成响应result.put("code", "200");result.put("message", "任务完成");result.put("flag",execResult);deferredResult.setResult(result);}catch (Exception e){//完成响应result.put("code", "500");result.put("message", "任务完成");result.put("flag",null);deferredResult.setResult(result);EXEC_CACHE.put(flag, "0");}});return deferredResult;}@Overridepublic String queryExecResult(String flag) {//前端根据具体值判断要不要继续轮询return EXEC_CACHE.get(flag);}

执行超时情况

轮询查询

未超时返回

http://www.dtcms.com/a/498492.html

相关文章:

  • 免费的企业黄页网站永久免费网站建设xiu021
  • 网站开发需求 模板seo技术外包 乐云践新专家
  • 如何利用国外分类网站开发客户呼市网站开发
  • 网站主机名是什么邢台交友吧
  • 房地产网站建设方案标志设计分析
  • 阿里云主机怎么做两个网站网站注册怎么做
  • 祁县网站建设凌云县城乡建设局网站
  • wordpress 修改后台地址福州seo博客
  • 古风网站建设wordpress文章页版权
  • 做摄影哪个网站专业搜索引擎seo公司
  • 推荐几个做网站比较好的公司网站开发的比较
  • 彩票网站维护会跑路吗大连做网站哪家便宜
  • 手机网站前端设计jsp做网站实例
  • 一级做爰片a视频网站我做的网站手机上不了
  • 自己做微网站东莞网站建设是什么
  • 有限责任公司和有限公司有啥区别seo外链是什么
  • 子目录创建网站基于jsp的网站开发开题报告
  • 开公司如何做网站推广页面网站拥有权
  • WordPress mvc插件宁波优化系统
  • 网站的信息容量电商代运营一般收多少服务费
  • 网站营销建设策划案闵行做网站的公司
  • 网站中有哪些标签需要优化在线做家装设计的网站
  • 恩阳建设局网站兰州专业网站建设公司哪家好
  • 遵义网站建设凤凰军事新闻头条
  • 嘉兴网站排名优化报价wordpress文章列表分页插件
  • 婚纱摄影网站排名推广接单网
  • 深圳手机网站建设多少钱做排名优化
  • 网站开发工具简述婚礼请柬电子版免费制作app
  • 乾县交通建设网站网络棋牌游戏
  • 安阳市网站建设玉林做网站公司