最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+SseEmitter和Vue3+EventSource實現(xiàn)實時數(shù)據(jù)推送

 更新時間:2025年03月04日 08:33:29   作者:麥當(dāng)勞不要薯條  
本文主要介紹了SpringBoot+SseEmitter和Vue3+EventSource實現(xiàn)實時數(shù)據(jù)推送,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

EventSource 的優(yōu)點

  • 簡單易用:EventSource 使用簡單,基于標(biāo)準(zhǔn)的 HTTP 協(xié)議,無需復(fù)雜的握手過程。
  • 自動重連:EventSource 具有內(nèi)置的重連機制,確保連接中斷后自動重新連接。
  • 輕量級:EventSource 使用長輪詢機制,消耗的資源相對較少,適合低帶寬環(huán)境。
  • 跨域支持:EventSource 允許在跨域環(huán)境下進行通信,通過適當(dāng)?shù)捻憫?yīng)頭授權(quán)來自不同域的客戶端連接。

1、SpringBoot實現(xiàn)SseEmitter

1.1簡易業(yè)務(wù)層

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Author tm
 * Date 2023/9/25
 * Version 1.0
 */
@RestController
@RequestMapping(path = "/sysTest/see")
public class SseControllerTest {
    private static Map<String, SseEmitter> sseCache = new ConcurrentHashMap<>();


    /**
     * 前端傳遞標(biāo)識,生成唯一的消息通道
     */
    @GetMapping(path = "subscribe", produces = {MediaType.TEXT_EVENT_STREAM_VALUE})
    public SseEmitter push(String id) throws IOException {
        // 超時時間設(shè)置為3s,用于演示客戶端自動重連
        SseEmitter sseEmitter = new SseEmitter(30000L);
        // 設(shè)置前端的重試時間為1s
        sseEmitter.send(SseEmitter.event().reconnectTime(1000).data("連接成功"));
        sseCache.put(id, sseEmitter);
        System.out.println("add " + id);
        sseEmitter.onTimeout(() -> {
            System.out.println(id + "超時");
            sseCache.remove(id);
        });
        sseEmitter.onCompletion(() -> System.out.println("完成?。?!"));
        return sseEmitter;
    }

    /**
     * 根據(jù)標(biāo)識傳遞信息
     */
    @GetMapping(path = "push")
    public String push(String id, String content) throws IOException {
        SseEmitter sseEmitter = sseCache.get(id);
        if (sseEmitter != null) {
            sseEmitter.send(SseEmitter.event().name("msg").data("后端發(fā)送消息:" + content));
        }
        return "over";
    }

    /**
     * 根據(jù)標(biāo)識移除SseEmitter
     */
    @GetMapping(path = "over")
    public String over(String id) {
        SseEmitter sseEmitter = sseCache.get(id);
        if (sseEmitter != null) {
            sseEmitter.complete();
            sseCache.remove(id);
        }
        return "over";
    }
}

2、Vue3對接EventSource

const  initEventSource = ()=>{
  if (typeof (EventSource) !== 'undefined') {
    const evtSource = new EventSource('https://xxx.xxx.x.x/sysTest/see/subscribe?id=002', { withCredentials: true }) // 后端接口,要配置允許跨域?qū)傩?
    // 與事件源的連接剛打開時觸發(fā)
    evtSource.onopen = function(e){
      console.log(e);
    }

    // 當(dāng)從事件源接收到數(shù)據(jù)時觸發(fā)
    evtSource.onmessage = function(e){
      console.log(e);
    }
    // 與事件源的連接無法打開時觸發(fā)
    evtSource.onerror = function(e){
      console.log(e);
      evtSource.close(); // 關(guān)閉連接
    }
    // 也可以偵聽命名事件,即自定義的事件
    evtSource.addEventListener('msg', function(e) {
      console.log(e.data)
    })
  } else {
    console.log('當(dāng)前瀏覽器不支持使用EventSource接收服務(wù)器推送事件!');
  }

  
}

3、測試、驗證、使用

使用postMan調(diào)用接口測試

3.1、 postMan調(diào)用后端"push"接口發(fā)送消息

在這里插入圖片描述

3.2、前端實時接收到數(shù)據(jù)

在這里插入圖片描述

4、踩坑

4.1、nginx對于EventSource連接要特殊處理

#eventSource
location /es/ {
    proxy_pass  http://請求地址/;
    #必須要設(shè)置當(dāng)前Connection 屬性
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
}

4.2、連接通道接口類型一定要設(shè)置MediaType.TEXT_EVENT_STREAM_VALUE

在這里插入圖片描述

4.3、 跨越問題,項目地址和接口地址需要在同一域名下

在這里插入圖片描述

4.4 、EventSource監(jiān)聽事件的類型需要與后端發(fā)送的類型一致

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于SpringBoot+SseEmitter和Vue3+EventSource實現(xiàn)實時數(shù)據(jù)推送的文章就介紹到這了,更多相關(guān)SpringBoot 實時數(shù)據(jù)推送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 淺談一下Servlet的定義以及運行原理

    淺談一下Servlet的定義以及運行原理

    相信有很多剛?cè)胄械呐笥褧苫骃ervlet到底是個什么意思,那么這篇文章就來淺談一下到底什么是Servlet,以及Servlet的原理與如何寫一個Servlet,,需要的朋友可以參考下
    2023-03-03
  • java線程安全鎖ReentrantReadWriteLock原理分析readLock

    java線程安全鎖ReentrantReadWriteLock原理分析readLock

    這篇文章主要為大家介紹了java線程安全鎖ReentrantReadWriteLock原理分析readLock,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Mybatis?SqlSession案例詳解

    Mybatis?SqlSession案例詳解

    這篇文章主要介紹了Mybatis?SqlSession詳解,本文我們講了如何創(chuàng)建SqlSession的幾個步驟,最后我們獲得一個DefaultSqlSession對象,里面包含了執(zhí)行器Executor和配置對象Configuration,需要的朋友可以參考下
    2023-04-04
  • SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實現(xiàn)方法

    SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot內(nèi)存數(shù)據(jù)導(dǎo)出成Excel的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring框架實現(xiàn)文件上傳功能

    Spring框架實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了Spring框架實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java二叉樹的四種遍歷方式詳解

    Java二叉樹的四種遍歷方式詳解

    這篇文章主要介紹了Java二叉樹的四種遍歷,二叉樹的遍歷可以分為前序、中序、后序、層次遍歷,需要的朋友可以參考下
    2021-11-11
  • SpringBoot自動配置原理詳解

    SpringBoot自動配置原理詳解

    SpringBoot的誕生就是為了簡化Spring中繁瑣的XML配置,其本質(zhì)依然還是Spring框架,使用SpringBoot之后可以不使用任何XML配置來啟動一個服務(wù),使得我們在使用微服務(wù)架構(gòu)時可以更加快速的建立一個應(yīng)用。本文將為具體介紹一下SpringBoot的原理,需要的可以參考一下
    2021-12-12
  • SpringBoot集成Druid配置(yaml版本配置文件)詳解

    SpringBoot集成Druid配置(yaml版本配置文件)詳解

    這篇文章主要介紹了SpringBoot集成Druid配置(yaml版本配置文件),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java精確抽取網(wǎng)頁發(fā)布時間

    Java精確抽取網(wǎng)頁發(fā)布時間

    這篇文章主要為大家詳細介紹了Java精確抽取網(wǎng)頁發(fā)布時間的相關(guān)資料,盡量做到精確無誤,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 使用Java實現(xiàn)讀取手機文件名稱

    使用Java實現(xiàn)讀取手機文件名稱

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)讀取手機文件名稱,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評論

丹东市| 乌鲁木齐市| 中超| 青神县| 香格里拉县| 陇南市| 呼和浩特市| 蕲春县| 安陆市| 洮南市| 昭平县| 新宁县| 嘉荫县| 香格里拉县| 兰考县| 莫力| 特克斯县| 定结县| 井冈山市| 宁波市| 黑水县| 辽阳市| 阳新县| 华池县| 松江区| 沅江市| 金沙县| 辛集市| 都昌县| 天峨县| 仪陇县| 房山区| 富锦市| 青浦区| 阳泉市| 多伦县| 贵溪市| 常州市| 冀州市| 金乡县| 徐水县|