在服务端向页面主动推送消息的业务场景下,有长轮训和websocket两种思路。
springboot 和websocket使用:https://blog.csdn.net/u014203449/article/details/102902078
现在看看长轮询:
设想一个业务场景:A用户打开页面,要求实时刷新数据,B用户操作新增数据,A页面刷新。
长轮询的做法是,A用户打开页面,就请求一个接口,js ajax请求时设置一个超时时间,比如60s。
$.ajax({
url:'', //请求的URL
timeout : 60000, //超时时间设置,单位毫秒
type : 'get', //请求方式,get或post
data :{}, //请求所传参数,json格式
dataType:'json',//返回的数据格式
success:function(data){ //请求成功的回调函数
alert("成功");
},
而接口中,判断数据是否有变化,如果有变化直接将数据返回,如果没有变化,将线程挂起60s,60s内有变化就返回数据,无变化返回空。
线程挂起可以用sleep 或者LockSupport.park 方法将其堵塞。
但堵塞后如何能发现数据变化,从而返回数据呢?因为是另一个用户B线程进行操作导致的数据变化。
1.轮询。可以在接口中循环sleep 几秒,去查询数据是否发生变化。
2.B用户线程操作后,可以找到A用户的长轮询线程,然后进行打断。A用户线程写个判断打断逻辑,如果打断标志为ture,就查询数据返回。
B线程如何找到A线程呢?可以设置一个全局线程安全集合,比如CopyOnWriteArraySet,把线程放进去。
而js 在接口响应后,继续发起一次请求,监听下一次数据的变化。
正好看到了Apollo配置中心,配置中心服务端如何通知客户端配置发生了变化,这就用到了长轮询。
里面写到了:
notifications/v2
接口,也就是NotificationControllerV2,参见RemoteConfigLongPollService版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181963.html原文链接:https://javaforall.cn