栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java使用DeferredResult实现http长连接

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java使用DeferredResult实现http长连接

java实现http长连接
  • 前提
  • 如何实现
  • Spring MVC的实现
  • 代码实现
  • springboot例子

前提

之前看apollo源码,有讲到apollo通知服务配置变动的方式有主动通知和定时拉取的两种方式,定时拉取使用的是定时线程去做的。而主动通知,则是使用http长连接实现的。

如何实现

http长连接类似于我们在web项目的debug模式一般,我们拿到http请求,并不立刻返回,而是等待一段时间后返回,如果期间有变动,则立刻返回,如果没有变动,则返回304,另一端判断http的返回,根据返回值进行不同操作。
http请求返回后,立刻再发起一个http请求,这样子则可以实现http的长连接了。

Spring MVC的实现

Spring MVC有异步返回的DeferredResult,可以使用这个进行实现http长连接。

代码实现
@RestController
@RequestMapping("/async")
public class AsyncController {
    final Map deferredResultMap = new ConcurrentReferenceHashMap();
    @GetMapping("/longPolling")
    public DeferredResult DeferredResultlongPolling(){
        DeferredResult deferredResult=new DeferredResult(60000L);
        deferredResultMap.put(deferredResult.hashCode(),deferredResult);
        deferredResult.onCompletion(()->{
            deferredResultMap.remove(deferredResult.hashCode());
            System.err.println("还剩"+deferredResultMap.size()+"个deferredResult未响应");
        });
        deferredResult.onTimeout(()->{
            deferredResult.setResult("304");
        });
        return deferredResult;
    }

    @GetMapping("/returnLongPollingValue")
    public void returnLongPollingValue(){
        for (Map.Entry resultEntry : deferredResultMap.entrySet()) {
            resultEntry.getValue().setResult("qaq");
        }
    }
}
springboot例子

链接: 例子.

https://github.com/xixingya/longPolling

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号