首页 > 其他分享 >SpringMVC 长轮询

SpringMVC 长轮询

时间:2023-04-12 14:35:39浏览次数:53  
标签:watchRequests SpringMVC 轮询 watch polling deferredResult id

修改 web.xml 让其支持异步请求

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>

        <!--配置异步支持-->
        <dispatcher>ASYNC</dispatcher>
    </filter-mapping>

    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <!--配置异步支持-->
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

需要在 servlet 和 filter 都配置异步支持

Java 代码

@RestController
@RequestMapping("/polling")
public class PollingController extends BaseController {

    // 存放监听某个Id的长轮询集合
    // 线程同步结构
    public static Multimap<String, DeferredResult<String>> watchRequests = Multimaps.synchronizedMultimap(HashMultimap.create());
    private Long TIME_OUT = 30 * 1000L;

    /**
     * 设置监听
     */
    @RequestMapping(path = "watch/{id}")
    public DeferredResult<String> watch(@PathVariable String id) {
        // 延迟对象设置超时时间
        DeferredResult<String> deferredResult = new DeferredResult<>(TIME_OUT);
        // 异步请求完成时移除 key,防止内存溢出
        deferredResult.onCompletion(() -> {
            watchRequests.remove(id, deferredResult);
        });
        // 注册长轮询请求
        watchRequests.put(id, deferredResult);
        return deferredResult;
    }

    /**
     * 变更数据
     */
    @RequestMapping(path = "publish/{id}")
    @ResponseBody
    public String publish(@PathVariable String id) {
        // 数据变更 取出监听ID的所有长轮询请求,并一一响应处理
        if (watchRequests.containsKey(id)) {
            Collection<DeferredResult<String>> deferredResults = watchRequests.get(id);
            for (DeferredResult<String> deferredResult : deferredResults) {
                deferredResult.setResult("ok " + DateUtil.now());
            }
        }
        return "success";
    }
}

效果

浏览器请求 /polling/watch/1 后,浏览器进入 30s 的等待中

30s 内请求打开新的 tab 访问 /polling/publish/1 后,访问 /polling/watch/1 的 tab 得到相应,并输出 ok

标签:watchRequests,SpringMVC,轮询,watch,polling,deferredResult,id
From: https://www.cnblogs.com/manastudent/p/17309680.html

相关文章

  • springmvc参数传递不给参数值默认值设置方法
    @RequestMapping("hello")publicvoiidtest001(@RequestParam(defaultValue="11")intage,@RequestParam(defaultValue="0.1")doublemoney){System.out.println("age:"+age+",money:"+money);} 注意: ......
  • SpringMVC怎么实现web端上传超大文件
    ​ 一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务......
  • SpringMVC中使用引入jquery不能加载页面
    今天在学习springMVC的json数据绑定时,需要使用到jquery发送ajax请求。但是当我通过是<script>标签引入了jquery.js。但是当我访问该jsp的时候就是不显示页面的内容我一直以为时SpringMVC的servelt拦截器拦截了静态资源,但是我过滤了静态资源还是不显示。后来才发现,我把<script......
  • SpringMVC
    1.MVCMVC:是模型(Model)视图(View)控制器(Controller)的简写,是一种软件设计规范将业务逻辑,数据和显示分离MVC是一种架构模式模型(dao,service):数据模型,提供要展示的数据,包含数据和行为视图(jsp):负责进行数据的展示控制器(servlet):接收用户的请求,委托给模型进行处理1.1SpringMVC框......
  • 【Linux】日志管理及日志轮询
    文章目录日志管理的意义常用的日志文件:last查看登录日志内容清空日志文件2./var/log/lastlog查看最后登录信息3./var/log/btmp用户登录系统的错误信息问题:怎么查看一个文件的大小日志的记录方式:日志的种类:日志级别:重--轻日志服务:配置文件:问题:mail,authpiv,cron放在哪里......
  • SpringMVC 结合 Servlet 不成功问题集锦
    问题集锦question1:Tomcat10版本太高causeTomcat10版本..主要就是说:Tomcat10之前的用户如果使用Tomcat10就需要将javax.*的导入转变为jakarta.*。这样才能将代码在Tomcat10中部署,还给你了一个迁移工具migrationtool来帮助你迁移代码。resolve换Tomcat9......
  • 一个简单SpringMVC的实现
    之前学习时候,是使用老师的自定义的一个SpringMVC模式,今天突然好奇,官方的SpringMVC架构咋弄,于是带着好奇的心去实现完成它其实这个模式也比较简单1:首先,我们创建一个maven,web的网页项目,JDK选择1.8版本   2:在创建完之后,鼠标右键点击main目录,同时选择java和resource包按回车......
  • 如何进行SpringMVC异步编程
    前言SpringMVC是我们平时用的最多的异步编程框架,但是我们在使用的时候基本上只是用到了它的同步编程。一般情况下是够用的,但是在并发量比较大的时候可能就不会够用了,因为一个请求会占用一个tomcat线程,这个时候我们可以尝试使用异步编程的方式来提高吞吐量。环境准备maven依赖:......
  • Quarkus系列—— RESTEasy与SpringMVC(二)
    简述RestEasy在Quarkus中的作用跟SpringMVC在SpringBoot中类似。简介RESTEasy是JBoss的一个开源项目,提供各种框架帮助你构建RESTfulWebServices和RESTfulJava应用程序。我们以第一部分的代码为例来介绍如何通过RESTEasy的各种注解来开发Web应用,因为RESTEasy实现了JAX......
  • SpringMVC大文件上传解决方案支持分片断点上传
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传  可以带参数        [HttpPost("upload")]        publicJsonResultuploadProject(I......