精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot + JavaScript 實(shí)時(shí)數(shù)據(jù)流:兩種完整實(shí)現(xiàn)

開發(fā) 前端
StreamingResponseBody 是 Spring MVC 提供的一個(gè)接口,用于異步流式傳輸響應(yīng)數(shù)據(jù)。它允許服務(wù)器在處理過程中逐步將數(shù)據(jù)寫入輸出流,適用于大文件下載、日志推送或?qū)崟r(shí)數(shù)據(jù)流場景。

環(huán)境:SpringBoot3.4.2

1. 簡介

在構(gòu)建實(shí)時(shí) Web 應(yīng)用時(shí),傳統(tǒng)的請(qǐng)求-響應(yīng)模式已無法滿足數(shù)據(jù)持續(xù)推送的需求。Spring Boot 提供了多種服務(wù)端流式方案:StreamingResponseBody 基于原始輸出流,適用于大文件下載或自定義流傳輸,靈活性高但需手動(dòng) flush;SseEmitter 遵循 Server-Sent Events(SSE)標(biāo)準(zhǔn),專為瀏覽器單向推送設(shè)計(jì),支持事件類型、消息 ID 和自動(dòng)重連,適合實(shí)時(shí)通知、日志流等場景;而 WebSocket 則提供全雙工通信,適用于聊天、協(xié)同編輯等高頻雙向交互場景。三者各有定位:SSE 簡單輕量、基于 HTTP、瀏覽器原生支持;WebSocket 功能強(qiáng)大但開銷較大;StreamingResponseBody 更偏向底層流控制。

本篇文章將重點(diǎn)介紹 StreamingResponseBody 與 SseEmitter 的前后端實(shí)現(xiàn),對(duì)比其在實(shí)時(shí)數(shù)據(jù)流中的應(yīng)用差異,幫助開發(fā)者按需選型。

2.實(shí)戰(zhàn)案例

2.1 方案1(StreamingResponseBody)

StreamingResponseBody 是 Spring MVC 提供的一個(gè)接口,用于異步流式傳輸響應(yīng)數(shù)據(jù)。它允許服務(wù)器在處理過程中逐步將數(shù)據(jù)寫入輸出流,適用于大文件下載、日志推送或?qū)崟r(shí)數(shù)據(jù)流場景。常與 ResponseEntity<StreamingResponseBody> 結(jié)合使用,需在子線程中執(zhí)行流式寫入,并通過 flush() 主動(dòng)推送數(shù)據(jù)到客戶端。

private final ObjectMapper objectMapper ;
public UserStreamingController(ObjectMapper objectMapper) {
  this.objectMapper = objectMapper;
}
@GetMapping("/stream")
public ResponseEntity<StreamingResponseBody> streamUsers() {
  StreamingResponseBody responseBody = os -> {
    datas.forEach(user -> {
      try {
        String json = this.objectMapper.writeValueAsString(user) + "\n";
        os.write(json.getBytes());
        os.flush() ;
        // 模擬延遲
        TimeUnit.MILLISECONDS.sleep(500) ;
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }) ;
  } ;


  return ResponseEntity.ok()
      .header("Content-Type", "text/plain;charset=utf-8")
      .body(responseBody);
}
前端讀取實(shí)現(xiàn)
async function fetchStream() {
  const response = await fetch('/users/stream');
  if (!response.body) {
    console.error('ReadableStream not supported');
    return;
  }
  let container = document.querySelector('#stream_data')
  // 清空所有子元素
  // 方案1
  // container.innerHTML = ""
  // 方案2
  // while (container.firstChild) {
  //  container.removeChild(container.firstChild);
  // }
  // 方案3
  // 專為"替換/清空子元素"設(shè)計(jì),比上面2個(gè)方案性能更好
  container.replaceChildren()
  const reader = response.body.getReader();
  const decoder = new TextDecoder('utf-8');
  let buffer = ''; // 用于拼接不完整的文本片段
  while (true) {
    const {done, value} = await reader.read();
    if (done) {
      console.log('Stream complete');
      break;
    }
    // 將 Uint8Array 解碼為字符串
    const chunk = decoder.decode(value, {stream: true});
    buffer += chunk;
    // 按行處理
    const lines = buffer.split('\n');
    buffer = lines.pop(); // 最后一行可能不完整,留在 buffer 中
    lines.forEach(line => {
      if (line) {
        appendData(container, line);
      }
    });
  }
  // 處理最后可能殘留的不完整行
  if (buffer) {
    appendData(container, buffer)
  }
}
function appendData(container, data) {
  let liNode = document.createElement("li");
  let dataNode = document.createTextNode(data)
  liNode.appendChild(dataNode)
  container.appendChild(liNode)
}
HTML頁面
<body>
  <button type="button" onclick="fetchStream()">獲取數(shù)據(jù)</button>
  <button type="button" onclick="fetchSse()">SSE獲取數(shù)據(jù)</button>
  <hr />
  <ul id="stream_data"></ul>
</body>
效果圖片

2.2 方案2(SSE)

SseEmitter是Spring用于實(shí)現(xiàn)服務(wù)器推送(Server-Sent Events, SSE)的類,允許服務(wù)器通過HTTP連接主動(dòng)向客戶端推送實(shí)時(shí)數(shù)據(jù)。它支持單向通信、事件流格式傳輸,適用于實(shí)時(shí)通知、數(shù)據(jù)流、聊天應(yīng)用等場景,能顯著提升用戶體驗(yàn)。

@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter sseUsers() {
  SseEmitter emitter = new SseEmitter(Long.MAX_VALUE);
  // 在子線程中發(fā)送數(shù)據(jù),避免阻塞請(qǐng)求線程
  Executors.newSingleThreadExecutor().submit(() -> {
    try {
      for (User user : datas) {
        try {
          // 序列化為 JSON
          String json = objectMapper.writeValueAsString(user);
          // 發(fā)送 SSE 消息
          emitter.send(SseEmitter.event().id(UUID.randomUUID().toString()) // 可選:消息ID
              .name("user-data") // 可選:事件類型
              .data(json) // 數(shù)據(jù)體
              .reconnectTime(5000) // 可選:重連時(shí)間
          );
          // 模擬延遲
          Thread.sleep(300);
        } catch (JsonProcessingException e) {
          // JSON 序列化失敗,發(fā)送錯(cuò)誤事件
          emitter.send(SseEmitter.event().name("error").data("JSON error: " + e.getMessage()));
        } catch (IOException e) {
          // 客戶端斷開等 IO 異常
          emitter.completeWithError(e);
          return;
        } catch (InterruptedException e) {
          Thread.currentThread().interrupt();
          emitter.completeWithError(e);
          return;
        }
      }
      // 先發(fā)送完成事件
      emitter.send(SseEmitter.event()
          .name("complete")
          .data("done")
          .id(UUID.randomUUID().toString()));
      // 所有數(shù)據(jù)發(fā)送完成
      emitter.complete();
    } catch (Exception e) {
      emitter.completeWithError(e);
    }
  });
  return emitter;
}
前端讀取實(shí)現(xiàn)
async function fetchSse() {
  const container = document.querySelector('#stream_data');
  container.replaceChildren(); // 清空
  // 使用 EventSource
  const eventSource = new EventSource('/users/sse');
  eventSource.onopen = (event) => {
    console.log('SSE 連接已建立');
  };
  // 監(jiān)聽自定義事件(name = "user-data")
  eventSource.addEventListener('user-data', function (event) {
    appendData(container, `${event.data}`);
  });
  // ? 監(jiān)聽完成事件
  eventSource.addEventListener('complete', function (event) {
    appendData(container, '? 所有數(shù)據(jù)加載完畢');
    // 主動(dòng)關(guān)閉連接,避免繼續(xù)重連
    eventSource.close();
  });
  // 監(jiān)聽錯(cuò)誤
  eventSource.onerror = function (event) {
    console.error('SSE 錯(cuò)誤:', event);
    if (eventSource.readyState === EventSource.CLOSED) {
      console.log('連接已關(guān)閉');
    }
  };
}
效果

圖片圖片圖片

責(zé)任編輯:武曉燕 來源: Springboot全家桶實(shí)戰(zhàn)案例
相關(guān)推薦

2023-08-18 09:29:59

Java數(shù)據(jù)流

2020-06-18 08:18:35

密碼加密安全

2010-09-28 15:12:27

Javascript

2009-06-15 15:02:48

Spring定時(shí)器

2023-10-11 14:37:21

工具開發(fā)

2021-01-25 14:10:49

Spring BootVueJava

2009-06-23 18:18:13

SpringHibernate

2023-09-26 09:29:08

Java數(shù)據(jù)

2010-10-09 15:12:00

JavaScript溢出

2011-08-09 13:50:01

iPhone動(dòng)畫UIView

2009-09-08 15:22:20

Spring依賴注入

2010-03-15 14:01:26

JavaScript

2010-07-13 10:10:28

WPF

2020-09-21 11:30:28

CanalMySQL數(shù)據(jù)庫

2022-02-21 08:18:38

option編程模式

2010-07-14 10:30:26

Perl多線程

2012-10-16 09:40:38

洗牌算法

2010-10-14 14:33:15

MySQL多表聯(lián)查

2022-06-08 15:12:34

前端前端截圖

2021-12-08 10:47:35

RabbitMQ 實(shí)現(xiàn)延遲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

av资源网一区| 亚洲xxx拳头交| 欧美影视一区二区三区| 亚洲欧洲精品一区| 亚洲av综合色区无码一二三区| 亚洲小说区图片区| 亚洲欧美变态国产另类| jizzzz日本| 国产传媒在线观看| 国产精品理伦片| 国产视频一区二区不卡| 最新在线中文字幕| 在线观看视频免费一区二区三区| 亚洲一级一级97网| 成人在线观看一区二区| 成人做爰视频www| 亚洲地区一二三色| 伊人天天久久大香线蕉av色| 五月激情六月婷婷| 极品销魂美女一区二区三区| 日本成人黄色片| 久久一二三四区| 欧美wwwww| 亚洲天堂av网| 亚洲国产综合视频| 香港久久久电影| 欧美日韩国产经典色站一区二区三区 | 中文字幕在线字幕中文| 日本一区二区免费高清| 日韩电影免费观看中文字幕| 中文字幕第10页| 99久久伊人| 日韩欧美中文字幕在线观看 | 亚洲理伦在线| 久精品免费视频| 欧美美女性生活视频| 久久99免费视频| 精品无人国产偷自产在线| 师生出轨h灌满了1v1| 91麻豆精品国产综合久久久 | 欧美黄色性生活| 亚洲最新无码中文字幕久久| 亚洲成人av一区二区| 国产一区二区三区乱码| 在线观看电影av| 最近日韩中文字幕| 一区二区三区在线视频看| 国产黄色免费在线观看| 久久日韩精品一区二区五区| 精品国产综合久久| 香蕉久久国产av一区二区| a级精品国产片在线观看| 国产精品区一区二区三在线播放 | 亚洲欧美制服丝袜| 中文字幕 亚洲一区| 奇米777国产一区国产二区| 精品国产亚洲在线| 人妻av一区二区| 国内精品偷拍| 国产丝袜精品视频| 一区二区三区伦理片| 激情综合网站| 中文字幕欧美精品日韩中文字幕| 国产中年熟女高潮大集合| 国产成人1区| 中文一区二区视频| 欧美日韩色视频| 激情文学一区| 国产91精品不卡视频| 精品成人无码久久久久久| 日韩精品一级中文字幕精品视频免费观看| 国产福利成人在线| 亚洲天堂网视频| 国产精品综合在线视频| 国产精品一 二 三| 黄色在线播放| 亚洲欧美综合另类在线卡通| 国产免费xxx| 成年男女免费视频网站不卡| 在线日韩av片| 色偷偷中文字幕| 黄色欧美网站| 在线视频欧美日韩| 欧美日韩三级在线观看| 99精品视频网| 国产欧美日韩中文| 亚洲狼人综合网| 久久久亚洲精品石原莉奈| 在线一区亚洲| 波多野结衣在线播放| 欧美伊人久久久久久久久影院 | 中文字幕一区二区久久人妻| 国内精品视频666| 激情五月综合色婷婷一区二区| 黄色av免费在线观看| 亚洲精品你懂的| 亚洲熟妇无码一区二区三区| 成人在线视频观看| 精品国产免费一区二区三区四区| 性高潮久久久久久久| 亚洲欧美偷拍自拍| 51ⅴ精品国产91久久久久久| 91激情在线观看| 99精品国产91久久久久久 | 在线观看日韩精品视频| 首页国产精品| 欧日韩在线观看| 亚洲av色香蕉一区二区三区| 国产日韩精品久久久| 99在线免费视频观看| 久久av影院| 精品视频久久久| 久久久无码精品亚洲国产| 日本少妇一区二区| 精品福利影视| 日韩电影免费观看| 欧美日韩精品三区| 国产一二三四五区| 在线视频日韩| 国产精品露出视频| 国内外激情在线| 欧美日韩国产色站一区二区三区| 欧美特黄一区二区三区| 亚洲一级一区| 91免费看蜜桃| dj大片免费在线观看| 精品视频一区 二区 三区| 人妻熟女aⅴ一区二区三区汇编| 欧美日韩国产一区精品一区| 国产精品视频男人的天堂| 日韩偷拍自拍| 欧美日韩色婷婷| www.男人天堂| 亚洲福利免费| 国产精品二区在线观看| 亚洲丝袜精品| 欧美一卡2卡三卡4卡5免费| av资源在线免费观看| 美女任你摸久久 | 亚洲最大黄网| 成人免费网站在线| 成人午夜在线影视| 91精品国产欧美一区二区18| 免费成人美女女在线观看| 久久精品国产免费| 在线综合视频网站| 亚洲香蕉久久| 欧美成aaa人片免费看| 国产熟女一区二区丰满| 亚洲精品日韩综合观看成人91| 亚洲一区二区偷拍| 欧美高清一区| 超碰97在线人人| 8x8ⅹ拨牐拨牐拨牐在线观看| 日韩欧美专区在线| 久久高清免费视频| 91在线porny国产在线看| 欧美亚洲一二三区| 精品久久影院| 国产女精品视频网站免费| 蜜桃视频网站在线观看| 日韩欧美一区中文| 日韩网红少妇无码视频香港| 91在线免费播放| 日日摸天天爽天天爽视频| 欧美日韩精品一区二区视频| 成人深夜直播免费观看| 午夜av在线播放| 亚洲二区中文字幕| 国产黄网在线观看| 国产精品久久久久久久裸模| 熟妇无码乱子成人精品| 亚洲高清电影| 人禽交欧美网站免费| 国产精品原创视频| 欧美第一页在线| 天堂v视频永久在线播放| 在线欧美小视频| 91 在线视频| 不卡的看片网站| 亚洲无吗一区二区三区| 欧美一区在线看| 久久亚洲精品欧美| 国内精品伊人| 久久人人爽人人| 成人精品一区二区三区免费| 欧美一区二区三区四区五区| 91看片在线播放| 中文字幕在线观看不卡视频| 天天躁日日躁狠狠躁av麻豆男男| 久久精品30| 欧美这里只有精品| 曰本一区二区三区视频| 亚洲自拍av在线| 久久夜夜操妹子| 久久久久久网站| 中文字幕在线观看日本| 亚洲成av人片在线观看香蕉| 国内av在线播放| 亚洲成人你懂的| 黄视频网站免费看| 国产日本欧美一区二区| 黑人玩弄人妻一区二区三区| 美国一区二区三区在线播放 | 伊人情人网综合| 婷婷成人影院| 成人资源av| 欧美国产视频| 日本一区二区不卡| av免费不卡国产观看| 日韩综合中文字幕| 久久经典视频| 亚洲电影成人av99爱色| 国产女人高潮时对白| 91激情五月电影| 国产在线视频你懂的| 综合久久给合久久狠狠狠97色| 少妇饥渴放荡91麻豆| 国产专区综合网| 五月天婷婷激情视频| 国产精品久久久一区二区| avove在线观看| 日韩国产在线| 色噜噜一区二区| 亚洲人成网77777色在线播放| 国产成人精品免费视频大全最热 | 国内精品久久国产| 91亚洲无吗| 亚洲已满18点击进入在线看片| 国产91精品在线| 国产精品高潮视频| 日韩av中字| 国产成人精品久久二区二区| 日韩激情电影| 欧美尤物巨大精品爽| 韩国成人二区| 欧美亚洲午夜视频在线观看| 国产精品蜜芽在线观看| 国外成人在线播放| 91超碰在线播放| 26uuu亚洲伊人春色| 小h片在线观看| 欧美在线视频观看| 欧美人与性动交xxⅹxx| 热99在线视频| 一二区成人影院电影网| 国产精品入口夜色视频大尺度 | av在线亚洲男人的天堂| 午夜日韩影院| 国产欧美日韩在线播放| 加勒比视频一区| 国产免费一区| 亚洲va久久| 日本一区视频在线观看| 日韩免费av| 久久av喷吹av高潮av| 欧美99久久| av在线观看地址| 久久精品国语| 亚洲欧美日韩一级| 国产一区三区三区| wwwxx日本| 久久男人中文字幕资源站| 日本欧美一区二区三区不卡视频| 中日韩av电影| 免费一级a毛片夜夜看| 亚洲va在线va天堂| 特级西西444www大精品视频免费看| 色综合天天综合网国产成人综合天 | 人人爽香蕉精品| 国产精品久久久久久久av福利| 国产成人综合视频| av直播在线观看| 国产精品福利一区二区三区| 日韩成人毛片视频| 欧美日韩激情视频8区| 中国一级特黄视频| 日韩亚洲欧美中文三级| 九九在线视频| 美女性感视频久久久| av影片在线| 国产精品爽黄69天堂a| 在线精品自拍| 天堂资源在线亚洲资源| 午夜久久福利| 无码内射中文字幕岛国片| 国产麻豆成人精品| 日本少妇高潮喷水xxxxxxx| 亚洲欧美一区二区三区孕妇| 中文字幕超碰在线| 67194成人在线观看| 欧美在线观看在线观看| 裸体女人亚洲精品一区| 国产精品迅雷| 91黄色国产视频| 精品理论电影| 国产特级淫片高清视频| 精品亚洲porn| 精品国产av无码| 亚洲午夜激情av| 91禁在线观看| 亚洲欧美在线一区二区| 国产色婷婷在线| 成人在线小视频| 欧美手机视频| 日本中文字幕网址| 国产精品91xxx| 久久久国产一级片| 欧美视频专区一二在线观看| 精品女同一区二区三区| 中文字幕av一区二区三区谷原希美| heyzo高清在线| 91网在线免费观看| 久久国产亚洲精品| 中文字幕乱码人妻综合二区三区 | 中文字幕第69页| 色综合天天综合| 人人妻人人澡人人爽人人欧美一区 | 精品久久久久久久久久久久久久久久久 | 老司机亚洲精品一区二区| 欧美日韩一区综合| 国产美女精品| 国产成人av无码精品| 一区二区三区在线观看网站| 一级片视频免费| 一本一道久久a久久精品逆3p | 久久精品主播| 中国一级特黄录像播放| 亚洲综合色在线| 亚洲精品国产suv一区| 久久成人精品一区二区三区| 日韩综合av| 自拍另类欧美| 狠狠狠色丁香婷婷综合激情 | 精品福利视频导航大全| 91sa在线看| 天天久久夜夜| 50路60路老熟妇啪啪| 久久久天堂av| 欧美黄色一级大片| 亚洲天堂网在线观看| 日本成人伦理电影| 日本在线播放一区| 毛片一区二区三区| 青青草华人在线视频| 欧美日韩国产美女| 在线黄色网页| 国产精品一区二区不卡视频| 欧美午夜精品| 国产69视频在线观看| 午夜精品福利一区二区三区蜜桃| 亚洲精品福利网站| 91精品国产乱码久久久久久蜜臀| 欧美成人午夜77777| 国产精品免费观看久久| 久久久久久久网| 亚洲系列第一页| 久久中文字幕一区| 波多野结衣在线一区二区| 久色视频在线播放| 国产亚洲综合色| 91成人国产综合久久精品| 久久久av一区| 久久91在线| 国产一线二线三线在线观看| 亚洲国产成人自拍| 精品人妻aV中文字幕乱码色欲| 久久久久久国产精品三级玉女聊斋 | 6080午夜不卡| 超碰99在线| 色女孩综合网| 国产不卡视频在线播放| 国产 欧美 日韩 在线| 伊人久久大香线蕉av一区二区| 色综合视频一区二区三区日韩 | 日韩成人免费电影| sm捆绑调教视频| 精品国免费一区二区三区| 综合日韩av| 国产卡一卡二在线| 99久久99久久综合| 中文字幕有码视频| 久久久久久亚洲精品不卡| 国产精品羞羞答答在线观看| 亚洲妇熟xx妇色黄蜜桃| 精品国产乱码久久久久久虫虫漫画 | 91免费看`日韩一区二区| 波多野结衣爱爱| 欧美大片免费看| 成人直播大秀| 日韩免费高清一区二区| 在线播放视频一区| 涩涩视频网站在线观看| 一区二区三视频| 久久中文字幕电影| a级片免费视频| 国产精品女主播| 亚洲乱亚洲高清| 欧美色图亚洲视频| 最近日韩中文字幕中文|