大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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配置中心,配置中心服务端如何通知客户端配置发生了变化,这就用到了长轮询。
里面写到了:
- 客户端会发起一个Http请求到Config Service的
notifications/v2
接口,也就是NotificationControllerV2,参见RemoteConfigLongPollService - NotificationControllerV2不会立即返回结果,而是通过Spring DeferredResult把请求挂起
- 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端
- 如果有该客户端关心的配置发布,NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace后,会立即请求Config Service获取该namespace的最新配置。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181963.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...