SpringBoot整合SSE,基于okhttp

一、引入依賴

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.10.0</version>
</dependency>
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-sse</artifactId><version>4.10.0</version>
</dependency>

二、創建 SSE 客戶端服務類

import okhttp3.*;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import okhttp3.sse.EventSources;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class SseClientService {private final OkHttpClient okHttpClient;private EventSource eventSource;public SseClientService() {this.okHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(0, TimeUnit.SECONDS) // 0表示不超時.writeTimeout(10, TimeUnit.SECONDS).build();}public void connectToSseServer(String url) {Request request = new Request.Builder().url(url).build();EventSource.Factory factory = EventSources.createFactory(okHttpClient);this.eventSource = factory.newEventSource(request, new EventSourceListener() {@Overridepublic void onOpen(EventSource eventSource, Response response) {System.out.println("SSE連接已建立");}@Overridepublic void onEvent(EventSource eventSource, String id, String type, String data) {System.out.printf("收到事件: id=%s, type=%s, data=%s%n", id, type, data);// 在這里處理收到的數據}@Overridepublic void onClosed(EventSource eventSource) {System.out.println("SSE連接已關閉");}@Overridepublic void onFailure(EventSource eventSource, Throwable t, Response response) {System.err.println("SSE連接失敗: " + t.getMessage());// 可以在這里實現重連邏輯reconnect(url);}});}private void reconnect(String url) {try {Thread.sleep(5000); // 5秒后重連connectToSseServer(url);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}public void closeConnection() {if (eventSource != null) {eventSource.cancel();}okHttpClient.dispatcher().executorService().shutdown();}
}

三、 創建控制器測試

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/sse-client")
public class SseClientController {private final SseClientService sseClientService;public SseClientController(SseClientService sseClientService) {this.sseClientService = sseClientService;}@GetMapping("/connect")public String connect() {// 連接到SSE服務器(可以是另一個Spring Boot應用的SSE端點)sseClientService.connectToSseServer("http://localhost:8080/sse-server/subscribe");return "SSE客戶端已啟動";}@GetMapping("/disconnect")public String disconnect() {sseClientService.closeConnection();return "SSE客戶端已關閉";}
}

四、 高級功能實現

1. 自定義事件處理
// 在EventSourceListener中添加更多事件處理
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {switch (type) {case "message":handleMessageEvent(data);break;case "system-alert":handleSystemAlert(data);break;default:handleDefaultEvent(data);}
}
2. 添加認證頭
public void connectToSseServerWithAuth(String url, String token) {Request request = new Request.Builder().url(url).header("Authorization", "Bearer " + token).build();// 其余代碼與基礎實現相同
}
3. 心跳檢測
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {if ("heartbeat".equals(type)) {System.out.println("收到心跳: " + data);return;}// 處理其他事件
}

五、OkHttpConfig單獨配置

import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;@Configuration
public class OkHttpConfig {@Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(0, TimeUnit.SECONDS) // 0表示不超時.writeTimeout(15, TimeUnit.SECONDS).retryOnConnectionFailure(true).build();}
}

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

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

相關文章

【哈希表】1399. 統計最大組的數目

1399. 統計最大組的數目 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數 n 。請你先求出從 1 到 n 的每個整數 10 進制表示下的數位和&#xff08;每一位上的數字相加&#xff09;&#xff0c;然后把數位和相等的數字放到同一個組中。 請你統計每個組中的數字數目&…

手動實現LinkedList

前言 大家好&#xff0c;我是Maybe。最近在學習數據結構中的鏈表&#xff0c;自己手動實現了一個LinkedList。我想與大家分享一下。 思維導圖 代碼部分 package Constant;public class constant {public static final String INDEX_IS_WRONG"輸入的下標不合法"; }p…

如何檢查瀏覽器是否啟用了WebGL2.0硬件加速

一:WebGL Inspector使用 打開 Chrome 或 Edge(推薦使用 Chromium 內核瀏覽器)。 安裝插件: ?? Spector.js on Chrome Web Store 安裝完成后,在瀏覽器工具欄看到綠色的 S 圖標 二:捕獲 WebGL 渲染幀 打開你要分析的 Web3D 網站(比如 https://3dviewer.net)。 點擊瀏…

“時間”,在數據處理中的真身——弼馬溫一般『無所不能』(DeepSeek)

電子表格時間處理真理&#xff1a;數值存儲最瘦身&#xff0c;真身闖關通四海。 筆記模板由python腳本于2025-04-23 22:25:59創建&#xff0c;本篇筆記適合喜歡在電子表格中探求時間格式的coder翻閱。 【學習的細節是歡悅的歷程】 博客的核心價值&#xff1a;在于輸出思考與經驗…

AXOP39062: 25MHz軌到軌輸入輸出雙通道運算放大器

AXOP39062是用于低壓應用(1.5V~5.5V)的雙通道運算放大器&#xff0c;具有軌到軌的輸入輸出工作范圍&#xff0c;非常適合需要小尺寸、大容性負載驅動能力的低壓應用。產品具有25MHz的增益帶寬&#xff0c;具有優異的噪聲性能和極低的失真度。 主要特性 軌到軌的輸入輸出范圍低…

基于大模型的胃食管反流病全周期預測與診療方案研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、胃食管反流病概述 2.1 疾病定義與分類 2.2 流行病學特征 2.3 發病機制 三、大模型技術原理與應用基礎 3.1 大模型簡介 3.2 適用于胃食管反流病預測的大模型類型 3.3 數據收集與預處理 四、大模型在胃食…

西門子S7-200SMART 控制Profinet閉環步進MD-4250-PN (1)電機及專欄介紹

一、前言 本系列是我繼 《西門子S7-1200PLC 控制步進電機 MD-4240-PN》系列專欄后&#xff0c;新開的一篇專欄。 系列的主題圍繞 S7-200SMART Profinet閉環步進(MD-4250-PN) 觸摸屏的硬件&#xff0c;預計作四篇文章&#xff0c;分別為&#xff1a;專欄介紹、硬件介紹、PLC…

bedtools coverage 獲取每個位置的測序深度

1.bedtools 文檔 $ bedtools --version bedtools v2.31.1coverage Compute the coverage over defined intervals. Usage:bedtools coverage [OPTIONS] -a <FILE> \-b <FILE1, FILE2, ..., FILEN>(or):coverageBed [OPTIONS] -a <FILE> \-b <FILE1,…

反向代理和DDNS的區別是什么?

反向代理&#xff08;Reverse Proxy&#xff09;和動態域名解析&#xff08;DDNS&#xff0c;Dynamic Domain Name System&#xff09;是兩種不同的網絡技術&#xff0c;雖然它們都與外部訪問內部服務相關&#xff0c;但解決的問題和應用場景完全不同。具體區別如下&#xff1a…

縮放點積注意力

Scaled Dot-Product Attention 論文地址 https://arxiv.org/pdf/1706.03762 注意力機制介紹 縮放點積注意力是Transformer模型的核心組件&#xff0c;用于計算序列中不同位置之間的關聯程度。其核心思想是通過查詢向量&#xff08;query&#xff09;和鍵向量&#xff08;key&am…

可吸收聚合物:醫療科技與綠色未來的交匯點

可吸收聚合物&#xff08;Biodegradable Polymers&#xff09;作為生物醫學工程的核心材料&#xff0c;正引領一場從“金屬/塑料植入物”到“智能降解材料”的范式轉移。根據QYResearch&#xff08;恒州博智&#xff09;預測&#xff0c;2031年全球可吸收聚合物市場銷售額將突破…

房地產項目績效考核管理制度與績效提升

房地產項目績效考核管理制度的核心目的是通過合理的績效考核機制&#xff0c;提升項目的整體運作效率&#xff0c;并鼓勵項目團隊成員的積極性。該制度適用于所有房地產項目部工作人員&#xff0c;涵蓋了項目經理和項目成員的考核。考核的主要內容包括項目經理和項目部成員的工…

【算法筆記】動態規劃基礎(一):dp思想、基礎線性dp

目錄 前言動態規劃的精髓什么叫“狀態”動態規劃的概念動態規劃的三要素動態規劃的框架無后效性dfs -> 記憶化搜索 -> dp暴力寫法記憶化搜索寫法記憶化搜索優化了什么&#xff1f;怎么轉化成dp&#xff1f;dp寫法 dp其實也是圖論首先先說結論&#xff1a;狀態DAG是怎樣的…

pytorch 51 GroundingDINO模型導出tensorrt并使用c++進行部署,53ms一張圖

本專欄博客第49篇文章分享了將 GroundingDINO模型導出onnx并使用c++進行部署,并嘗試將onnx模型轉換為trt模型,fp16進行推理,可以發現推理速度提升了一倍。為此對GroundingDINO的trt推理進行調研,發現 在GroundingDINO-TensorRT-and-ONNX-Inference項目中分享了模型導出onnx…

一個關于相對速度的假想的故事-6

既然已經知道了速度是不能疊加的&#xff0c;同時也知道這個疊加是怎么做到的&#xff0c;那么&#xff0c;我們實際上就知道了光速的來源&#xff0c;也就是這里的虛數單位的來源&#xff1a; 而它的來源則是&#xff0c; 但這是兩個速度的比率&#xff0c;而光速則是一個速度…

深度學習激活函數與損失函數全解析:從Sigmoid到交叉熵的數學原理與實踐應用

目錄 前言一、sigmoid 及導數求導二、tanh 三、ReLU 四、Leaky Relu五、 Prelu六、Softmax七、ELU八、極大似然估計與交叉熵損失函數8.1 極大似然估計與交叉熵損失函數算法理論8.1.1 伯努利分布8.1.2 二項分布8.1.3 極大似然估計總結 前言 書接上文 PaddlePaddle線性回歸詳解…

Python內置函數---breakpoint()

用于在代碼執行過程中動態設置斷點&#xff0c;暫停程序并進入調試模式。 1. 基本語法與功能 breakpoint(*args, kwargs) - 參數&#xff1a;接受任意數量的位置參數和關鍵字參數&#xff0c;但通常無需傳遞&#xff08;默認調用pdb.set_trace()&#xff09;。 - 功能&#x…

從零手寫 RPC-version1

一、 前置知識 1. 反射 獲取字節碼的三種方式 Class.forName("全類名") &#xff08;全類名&#xff0c;即包名類名&#xff09;類名.class對象.getClass() (任意對象都可調用&#xff0c;因為該方法來自Object類&#xff09; 獲取成員方法 Method getMethod(St…

ARINC818協議(六)

上圖中&#xff0c;紅色虛線上面為我們常用的simple mode簡單模式&#xff0c;下面和上面的結合在一起&#xff0c;就形成了extended mode擴展模式。 ARINC818協議 container header容器頭 ancillary data輔助數據 視頻流 ADVB幀映射 FHCP傳輸協議 R_CTRL:路由控制routing ctr…

PyCharm 鏈接 Podman Desktop 的 podman-machine-default Linux 虛擬環境

#工作記錄 PyCharm Community 連接到Podman Desktop 的 podman-machine-default Linux 虛擬環境詳細步驟 1. 準備工作 確保我們已在 Windows 系統中正確安裝并啟動了 Podman Desktop。 我們將通過 Podman Desktop 提供的名為 podman-machine-default 的 Fedora Linux 41 WSL…