当前位置: 首页 > news >正文

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();}
}

相关文章:

  • 融山科技前端面经
  • 如何解决极狐GitLab 合并冲突?
  • 集结号海螺捕鱼游戏源码解析(第三篇):拉霸机模块开发详解与服务器开奖机制
  • 【Unity】简单实现基于TCP的阻塞式Socket的文本消息通信
  • 极狐GitLab 如何撤销变更?
  • git提交
  • [java八股文][Java基础面试篇]I/O
  • 缓存与数据库一致性方案
  • 二进制部署Kubernetes1.32.4最新版本高可用集群及附加组件
  • 最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程
  • 【TeamFlow】4.3.4 长度单位
  • FPGA开发流程初识
  • WPF 图片文本按钮 自定义按钮
  • 人工智能华迪杯比赛项目推荐
  • xcode 16 遇到contains bitcode
  • 深度剖析塔能科技精准节能方案:技术创新与实践价值
  • 人爱科技-RACRM客户管理系统介绍
  • 如何开启远程桌面连接外网访问?异地远程控制内网主机
  • Javashop新零售电商系统:构建智能零售生态的终极解决方案
  • 【计算机网络】现代网络技术核心架构与实战解析
  • 耐克领跑女性运动市场:持续加码、创新,更多新增长点有望涌现
  • 什么是中国好手艺?材美、工巧、器韵、时宜
  • 古文启蒙佳作!锺叔河《念楼学短合集》出修订版
  • 中印尼“2+2”:中国周边外交的范式突破与东南亚棋局重构
  • 清华成立教育学院:加快高层次人才培养、加强教育学科建设
  • 央媒聚焦人形机器人:为何发展突然加速?中国制造有何优势?