java长轮询「建议收藏」

java长轮询「建议收藏」在服务端向页面主动推送消息的业务场景下,有长轮训和websocket两种思路。springboot和websocket使用:https://blog.csdn.net/u014203449/article/details/102902078现在看看长轮询:设想一个业务场景:A用户打开页面,要求实时刷新数据,B用户操作新增数据,A页面刷新。1.页面长轮询的做法是,A用户打…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在服务端向页面主动推送消息的业务场景下,有长轮训和websocket两种思路。

springboot 和websocket使用:https://blog.csdn.net/u014203449/article/details/102902078

现在看看长轮询:

 

设想一个业务场景:A用户打开页面,要求实时刷新数据,B用户操作新增数据,A页面刷新。

1.页面

长轮询的做法是,A用户打开页面,就请求一个接口,js ajax请求时设置一个超时时间,比如60s。

 $.ajax({
  url:'',  //请求的URL
  timeout : 60000, //超时时间设置,单位毫秒
  type : 'get',  //请求方式,get或post
  data :{},  //请求所传参数,json格式
  dataType:'json',//返回的数据格式
  success:function(data){ //请求成功的回调函数
    alert("成功");
  },

2.接口

而接口中,判断数据是否有变化,如果有变化直接将数据返回,如果没有变化,将线程挂起60s,60s内有变化就返回数据,无变化返回空。

线程挂起可以用sleep 或者LockSupport.park 方法将其堵塞。

3.打断阻塞

但堵塞后如何能发现数据变化,从而返回数据呢?因为是另一个用户B线程进行操作导致的数据变化。

1.轮询。可以在接口中循环sleep 几秒,去查询数据是否发生变化。

2.B用户线程操作后,可以找到A用户的长轮询线程,然后进行打断。A用户线程写个判断打断逻辑,如果打断标志为ture,就查询数据返回。

B线程如何找到A线程呢?可以设置一个全局线程安全集合,比如CopyOnWriteArraySet,把线程放进去。

4.下一次轮询

而js 在接口响应后,继续发起一次请求,监听下一次数据的变化。

5.长轮询案列

正好看到了Apollo配置中心,配置中心服务端如何通知客户端配置发生了变化,这就用到了长轮询。

Apollp的地址:https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E8%AE%BE%E8%AE%A1#21-%E9%85%8D%E7%BD%AE%E5%8F%91%E5%B8%83%E5%90%8E%E7%9A%84%E5%AE%9E%E6%97%B6%E6%8E%A8%E9%80%81%E8%AE%BE%E8%AE%A1

里面写到了:

  1. 客户端会发起一个Http请求到Config Service的notifications/v2接口,也就是NotificationControllerV2,参见RemoteConfigLongPollService
  2. NotificationControllerV2不会立即返回结果,而是通过Spring DeferredResult把请求挂起
  3. 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端
  4. 如果有该客户端关心的配置发布,NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace后,会立即请求Config Service获取该namespace的最新配置。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181963.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTTP.UTF_8过时

    HTTP.UTF_8过时

    2021年5月16日
    155
  • 搜索引擎自动提交连接php文件,死链检测工具(自动提交给百度,逆天了)

    搜索引擎自动提交连接php文件,死链检测工具(自动提交给百度,逆天了)每个网站都避免不了404死链的存在。造成死链的原因有很多,比如说文章页被删除、链接被修改、网页链接更换存储路径等,这些都会成为死链。这些死链的产生,降低了搜索引擎对网站的友好度、影响用户体验,甚至会导致网站排名下降等。刚操作MAY博客的时候,文章的内容不是很多,遇到死链,只是简单的手动一个个去站长平台提交。但随着文章及页面的不断增加,一个个手动去操作,是不是麻烦了些。咦,是否能借助死链检测工具,自…

    2022年7月23日
    11
  • pcanywhere远程控制的步骤_windows10远程桌面端口修改

    pcanywhere远程控制的步骤_windows10远程桌面端口修改  PcAnywhere远程连接默认端口是5631[数据端口]、5632[状态端口],实际发现其实防火墙打开5631[数据端口]端口就可以自由访问。要改变Pcanywhere数据端口[5631]要去编辑系统注册表,找到以下键值:开始->运行->regedit:HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\pcAny…

    2022年9月13日
    0
  • Pytest(1)安装与入门「建议收藏」

    Pytest(1)安装与入门「建议收藏」pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

    2022年7月31日
    2
  • Python – 两数之和

    Python – 两数之和给定列表a和一个目标值target,求列表中两数之和为target的值的索引;a=[1,5,6,8,9,4,5,6,3,2,1,7,5,6,9,8,4,5,6,2,1,0,1,2,0,1,2,5,9,10]b=[11,55,88,99,66,4,77,33,22,1,6,12,35]穷举(适应性强)defx(nums,target):result=[]…

    2022年5月3日
    39
  • spring cloud 入门系列五:使用Feign 实现声明式服务调用

    一、SpringCloudFeign概念引入通过前面的随笔,我们了解如何通过SpringCloudribbon进行负责均衡,如何通过SpringCloudHystrix进行服务断路保护,两

    2022年2月16日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号