SSE SseEmitter.completeWithError(e) 觸發的處理邏輯

Java 客戶端使用 OkHttp 監聽 SSE(Server-Sent Events) 的情況下,當服務端調用 SseEmitter.completeWithError(e),客戶端會觸發 EventSourceListeneronFailure() 方法(而不是 onError)。


1. 服務端(Spring Boot)調用 completeWithError

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;@RestController
public class SseController {@GetMapping("/sse-stream")public SseEmitter streamEvents() {SseEmitter emitter = new SseEmitter();new Thread(() -> {try {for (int i = 0; i < 5; i++) {emitter.send(SseEmitter.event().data("Event " + i));Thread.sleep(1000);}// 模擬一個錯誤并主動關閉throw new RuntimeException("Server-side error!");} catch (Exception e) {emitter.completeWithError(e); // 觸發客戶端的 onFailure()}}).start();return emitter;}
}

2. 客戶端(Java + OkHttp)監聽 SSE

OkHttp 提供了 EventSource 類來監聽 SSE 事件,并需要實現 EventSourceListener 來接收回調。

關鍵方法

  • onOpen() – 連接建立時觸發。
  • onEvent() – 收到服務器事件時觸發。
  • onClosed() – 服務器主動關閉(emitter.complete())時觸發。
  • onFailure() – 服務器調用 completeWithError() 或網絡錯誤時觸發

代碼示例

import okhttp3.*;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import okhttp3.sse.EventSources;public class SseClient {public static void main(String[] args) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://localhost:8080/sse-stream").build();EventSource.Factory factory = EventSources.createFactory(client);factory.newEventSource(request, new EventSourceListener() {@Overridepublic void onOpen(EventSource eventSource, Response response) {System.out.println("SSE connected!");}@Overridepublic void onEvent(EventSource eventSource, String id, String type, String data) {System.out.println("Received event: " + data);}@Overridepublic void onClosed(EventSource eventSource) {System.out.println("SSE closed by server.");}@Overridepublic void onFailure(EventSource eventSource, Throwable t, Response response) {System.err.println("SSE error: " + t.getMessage());// 可以在這里重試}});}
}

3. 執行流程

  1. 服務端
    • 發送5條事件后,調用 emitter.completeWithError(e)
  2. 客戶端
    • 收到5條正常事件(onEvent())。
    • 當服務端 completeWithError(e) 時,觸發 onFailure(),并打印錯誤信息。

4. 總結

服務端行為客戶端(OkHttp)回調方法
emitter.send(data)onEvent()
emitter.complete()onClosed()
emitter.completeWithError(e)onFailure()
網絡斷開/超時onFailure()

因此,SseEmitter.completeWithError(e) 會觸發客戶端的 onFailure() 方法,而不是 onError(這是瀏覽器 EventSource 的行為)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73732.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73732.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73732.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4月手機新品前瞻,影像,性能與設計卷得起飛

在智能手機市場中,4月向來是新品頻發的黃金時段。各大手機廠商紛紛摩拳擦掌,準備推出自家的重磅機型,在影像、性能與設計等核心領域展開激烈角逐,一場沒有硝煙的“科技大戰”即將拉開帷幕。接下來,讓我們一同深入了解那些備受矚目的新品,提前感受科技進步帶來的魅力。 一…

設計審查效率革命|CAD原生數據直通自動公差驗證

“為何 90% 的 GD&T 問題在設計評審時未被發現&#xff1f;怎樣避免因 GD&T 考慮不周導致的批量返工&#xff1f;” 這正是 CETOL 自動輔助審查設計系統要解決的核心問題&#xff1a;通過200結構化審查規則攔截潛在設計疏漏。 功能一&#xff1a;裝配約束健康診斷&…

k8s scheduler幾種擴展方式的關系及區別

網上關于scheduler擴展介紹的文章很多&#xff0c;但都是東說一句西說一嘴&#xff0c;完全沒有邏輯性&#xff0c;對于邏輯建構者看著很痛苦&#xff0c;這篇文章不會深入教你怎么擴展&#xff0c;而是教你幾種擴展方式的關系和邏輯結構&#xff1a; 目前Kubernetes支持五種方…

近場探頭的選型

近場探頭包括磁場探頭和電場探頭。 下圖中畫圈的是電場探頭&#xff1a; 左側3只是磁場探頭&#xff0c;最右側一只是電場探頭。不同孔徑的磁場探頭的有效測量距離和分辨率不同 電場探頭和磁場探頭分別在什么情況下使用&#xff1a; 一般近場測試&#xff0c;使用的都是磁場探…

Pycharm運行時報“Empty suite”,可能是忽略了這個問題

問題&#xff1a;使用Pycharm運行testcases目錄下的.py文件&#xff0c;報“Empty suite”&#xff0c;沒有找到測試項。 排查過python解釋器、pytest框架安裝等等&#xff0c;依然報這個錯&#xff0c;依然沒找到&#xff0c;最后終端運行&#xff1a; pytest test_demo.py&a…

鴻蒙北向應用開發:deveco 5.0 kit化文件相關2

鴻蒙北向應用開發:deveco 5.0 kit化文件相關 在kit化時,有時候會出現這樣一種場景即你想把已有的d.ts導出換個名字,這樣從名字上更貼合你的kit聚合 什么意思呢?比如現在有 ohos.hilog.d.ts 導出了hilog,現在你想kit化hilog,使得hilog導出名字為usrhilog,這樣用戶在使用你的k…

《Python實戰進階》No37: 強化學習入門:Q-Learning 與 DQN-加餐版1 Q-Learning算法可視化

在《Python實戰進階》No37: 強化學習入門&#xff1a;Q-Learning 與 DQN 這篇文章中&#xff0c;我們介紹了Q-Learning算法走出迷宮的代碼實踐&#xff0c;本文加餐&#xff0c;把Q-Learning算法通過代碼可視化呈現。我嘗試了使用Matplotlib實現&#xff0c;但局限于Matplotli…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服務 # user li 20250325# 檢查當前用戶是否為root用戶 # 因為配置DNS服務通常需要較高的權限&#xff0c;只有root用戶才能進行一些關鍵操作 if [ "$USER" ! "root" ]; then# 如果不是root用戶&#xff0c;輸出錯誤信息echo "…

GenBI 中如何引入 LLM 做意圖路由,區分查數據還是閑聊

寫在前面 生成式商業智能(Generative BI, GenBI)的魅力在于其能夠理解用戶的自然語言,并將復雜的數據查詢和分析過程自動化。用戶不再需要學習 SQL 或操作復雜的界面,只需像與同事交談一樣提出問題,就能獲得數據洞察。然而,一個現實的挑戰是:用戶的輸入并非總是明確的數…

OmniPlan Pro for Mac 項目管理流程

OmniPlan Pro for Mac 項目管理流程 文章目錄 OmniPlan Pro for Mac 項目管理流程一、介紹二、效果三、下載 一、介紹 OmniPlan Pro mac是一款項目管理流程軟件。能被用來優化資源、精簡預算快速共享或添加任務&#xff0c;旨在能夠幫助您可視化維護和簡化項目&#xff0c;包含…

人工智能之數學基礎:矩陣的相似變換

本文重點 矩陣的相似變換是線性代數中一個至關重要的概念,它揭示了矩陣之間的一種特殊關系,并通過可逆矩陣將一個矩陣轉化為另一個相似矩陣,同時保持矩陣的某些本質特征不變。在機器學習領域,矩陣的相似變換發揮著不可或缺的作用,廣泛應用于數據降維、聚類分析、分類推薦…

2025藍橋杯備賽Day12——P8598 [藍橋杯 2013 省 AB] 錯誤票據

&#x1f50d; 2025藍橋杯備賽Day12——P8598 [藍橋杯 2013 省 AB] 錯誤票據 &#x1f680; 題目速覽 題目難度&#xff1a;??&#xff08;適合掌握基礎字符串處理與數組操作&#xff09; 考察重點&#xff1a;輸入處理、數組排序、邏輯判斷 P8598 [藍橋杯 2013 省 AB] 錯…

3.28日,NBA,歐籃聯全掃盤,太陽VS森林狼

3.28日歐籃聯掃盤 301費內巴切 vs 巴斯克 (-10.5)&#xff0c;總分預設&#xff1a;170.5 背景&#xff1a;比賽于2025年3月28日在費內巴切的烏爾克體育館舉行&#xff0c;費內巴切為主隊。根據EuroLeague排名&#xff0c;費內巴切位列第二&#xff08;21勝10負&#xff09;&am…

【動態編譯】Roslyn中 SyntaxKind 枚舉類型

在 Roslyn&#xff08;.NET 的編譯器平臺&#xff09;中&#xff0c;SyntaxKind 是一個枚舉類型&#xff0c;定義了 C# 語言中所有可能的語法節點類型。它是 Roslyn 抽象語法樹&#xff08;AST&#xff09;的基礎&#xff0c;用于標識每個 SyntaxNode 的具體種類。SyntaxKind 的…

【SpringCloud】Eureka的使用

3. Eureka 3.1 Eureka 介紹 Eureka主要分為兩個部分&#xff1a; EurekaServer: 作為注冊中心Server端&#xff0c;向微服務應用程序提供服務注冊&#xff0c;發現&#xff0c;健康檢查等能力。 EurekaClient: 服務提供者&#xff0c;服務啟動時&#xff0c;會向 EurekaS…

前端知識點---window.location.assign() 和 window.location.href 的區別(javascript)

window.location.assign() 和 window.location.href 的主要區別&#xff1a; 讀取和設置 window.location.href&#xff1a;既可以讀取當前 URL&#xff0c;也可以通過賦值更改 URL。 window.location.assign()&#xff1a;只能用于跳轉到新的 URL&#xff0c;不能讀取當前地…

OpenCV圖像拼接(3)圖像拼接類cv::detail::MultiBandBlender

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::MultiBandBlender 是 OpenCV 中用于圖像拼接&#xff08;stitching&#xff09;模塊的一個類&#xff0c;主要用于將多張重疊的圖像…

王者榮耀服務器突然崩了

就在剛剛王者榮耀服務器突然崩了 #王者榮耀崩了#的話題毫無預兆地沖上熱搜&#xff0c;許多玩家發現游戲登錄界面反復彈出異常提示&#xff0c;匹配成功后卡在加載界面&#xff0c;甚至出現對局數據丟失的情況。根據官方公告&#xff0c;目前技術團隊已在全力搶修服務器 #王者…

【JavaScript】JavaScript Promises實踐指南

【JavaScript】JavaScript Promises實踐指南 你了解JavaScript中的Promises嗎&#xff1f;這是一個很多人一開始就放棄的主題&#xff0c;但我會盡量讓它變得盡可能簡單。 1. “Promise”到底是什么&#xff1f; “Promise”是異步編程中的一個基本概念&#xff0c;特別是在J…

計算機視覺總結

以下是針對上述問題的詳細解答,并結合代碼示例進行說明: 1. 改進YOLOv5人臉檢測模塊,復雜光照場景準確率從98.2%提升至99.5% 優化具體過程: 光照補償:在數據預處理階段,采用自適應光照補償算法,對圖像進行實時增強,以減少光照變化對人臉檢測的影響。數據增強:在訓練…