springboot实战第四章-服务端推送技术

springboot实战第四章-服务端推送技术

服务端推送技术

本节的服务端推送技术基于:当客户端向服务端发送请求,服务端会抓住这个请求不放,当有数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求,周而复始

第一种:基于SSE(Server Send Event)

1.演示控制器

package com.just.springmvc4.controller;

import java.util.Random;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 服务端推送
 * 在消息体后面有两个换行符\n,代表当前消息体发送完毕,一个换行符标识当前消息并未结束,
 * 浏览器需要等待后面数据的到来后再触发事件;
 */
@RestController
public class SSEController {
    @RequestMapping(value ="/push",produces = "text/event-stream;charset=UTF-8")
    public String sse(){
        Random r=new Random();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "data:当前增加的收入:"+r.nextInt(1000)+"元"+"\n\n";
    }
}

注意推送的数据格式后面要有\n\n,输出的媒体类型为:text/event-stream,这是服务器端SSE的支持

2.演示页面

新建sse.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SSE服务端推送测试</title>
    <style>
        h1{
            color:red;
        }
    </style>
</head>
<body>
   <div id="msgFromPush"></div>
   <script src="../assets/js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script>
    /**
     * HTML5规范中提供了服务端事件EventSource,浏览器在实现了该规范的前提下创建一个EventSource连接后,
     * 便可收到服务端的发送的消息,这些消息需要遵循一定的格式,
     * 对于前端开发人员而言,只需在浏览器中侦听对应的事件皆可。
     * 浏览器端,需要创建一个EventSource对象,并且传入一个服务端的接口URI作为参数。
     */
    if(!!window.EventSource){
        var source=new EventSource("push");
        s='';
        source.addEventListener('message',function (e) {
            s+="<h1>"+e.data+"</h1>";
            $("#msgFromPush").html(s);
        });

        source.addEventListener('open',function (e) {
            console.log("连接打开");
        },false);

        source.addEventListener('error',function (e) {
            if(e.readyState==EventSource.CLOSED){
                console.log("连接关闭");
            }else{
                console.log(e.readyState);
            }
        },false);

    }else{
        alert("当前这个渣渣浏览器不支持SSE");
    }
</script>
</body>
</html>

EventSource只有新式的浏览器才有,所以这种推送技术有局限性,且不支持跨域

至于jsp页面的ViewController配置这里就不多讲了。

3.演示效果

如下图所示:

springboot实战第四章-服务端推送技术

第二种:Servlet3.0+异步方法处理

1.servlet配置文件开启异步方法支持

 //注册DispatcherServlet
        ServletRegistration.Dynamic servlet=servletContext.addServlet("dispatcher",new DispatcherServlet(context));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
        servlet.setAsyncSupported(true);  //开启异步方法的支持

2.异步任务控制器

package com.just.springmvc4.controller;

import com.just.springmvc4.service.PushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

@RestController
public class AsyncController {
    @Autowired
    private PushService pushService;

    @RequestMapping(value = "/defer",produces = "text/html;charset=UTF-8")
    public DeferredResult<String> deferredCall(){
        return pushService.getAsyncUpdate();
    }

}

3.定时任务

定时更新DeferredResult

package com.just.springmvc4.service;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.async.DeferredResult;

@Service
public class PushService {
    private DeferredResult<String> deferredResult;
    public DeferredResult<String> getAsyncUpdate(){
        deferredResult=new DeferredResult<String>();
        return deferredResult;
    }
    @Scheduled(fixedDelay = 3000)
    public void refresh(){
        if(deferredResult!=null){
            deferredResult.setResult("当前时间戳:"+System.currentTimeMillis());
        }
    }

}

4.演示页面

新建async.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>servlet async support</title>
</head>
<body>
<div id="content">

</div>
<h1 id="text"></h1>
<script src="../assets/js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script>
    deferred();
    function deferred() {
        $.get('defer',function (data) {
            $("#content").append("<h1>"+data+"</h1>");
            deferred();
        })
    }
</script>
</body>
</html>

5.MVC开启计划任务的支持

在MyMvcConfig类上加上注解

@EnableScheduling

6.演示效果

springboot实战第四章-服务端推送技术

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100310.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 在 vscode 中使用 Git :拉取、提交、克隆

    在 vscode 中使用 Git :拉取、提交、克隆PS:转载此文后,网友在评论中提到还有其它方法,不过目前个人尚在研究中,有兴趣的朋友们也可自行一探究竟…————————————————————————-1、将代码放到码云到码云里新建一个仓库,完成后码云会有一个命令教程按上面的来就行了 码云中的使用教程:Git全局设置:…

  • springboot项目实战视频教程_Spring揭秘

    springboot项目实战视频教程_Spring揭秘前言:花了大概一个多月的时间,debug自己录制的SpringbBoot实战历程~从菜鸟到小牛课程已经完成了!包含课时46节,涵盖知识点以及详情如下图所示。课程介绍:本课程以实际业务场景为出发点、实战撸码为主、理论概念为辅,零基础一步一个脚印讲解当前微服务项目或分布式系统下SpringBoot各种典型的应用场景及其涉及的各个核心要点!课程目的:本课程目的在于给那些需要入门Sp…

  • goland 2021.11.4 激活【中文破解版】

    (goland 2021.11.4 激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • Visual Studio Code(VSCODE)语言设置为中文

    Visual Studio Code(VSCODE)语言设置为中文

  • 360企业版 修改服务器ip,360企业版快速安装部署图文教程「建议收藏」

    360企业版 修改服务器ip,360企业版快速安装部署图文教程「建议收藏」360企业版V5.0.6.1310官方最新版类型:服务器区大小:177.0M语言:中文评分:4.5标签:立即下载内容索引安装须知安装环境推荐全新安装控制中心旧版本升级安装控制中心配置控制中心1.360企业版有旧版本(基于C/S架构,点此下载)和新版本(基于B/S架构,点此下载)。用户可以选择继续使用旧版本(终端无数量限制,但版本不再更新,也不再添加新的产品功能);2.已有用户进行新旧版本升级时,…

  • C语言整型转字符串_c++整形转字符串

    C语言整型转字符串_c++整形转字符串本文主要介绍在C++编程语言中,将整型转换为字符串类型的具体方法。1使用to_string函数在C++11标准中,可以使用to_string函数,将整型转换为字符串类型。1.1to_string函数介绍to_string函数的用法如下:stringto_string(intval);stringto_string(longval);stringto_string(longlongval);stringto_string(unsigned

    2022年10月18日

发表回复

您的电子邮箱地址不会被公开。

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