From 1c3554a35ee9fb265f6ecf38f9e23f41035b08e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Thu, 22 May 2025 15:03:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96sse=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=96=AD=E5=BC=80=E8=BF=9E=E6=8E=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../push/service/SSEManagerBase.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/nflg-mobilebroken-push/src/main/java/com/nflg/mobilebroken/push/service/SSEManagerBase.java b/nflg-mobilebroken-push/src/main/java/com/nflg/mobilebroken/push/service/SSEManagerBase.java index 06f971c0..b0c34185 100644 --- a/nflg-mobilebroken-push/src/main/java/com/nflg/mobilebroken/push/service/SSEManagerBase.java +++ b/nflg-mobilebroken-push/src/main/java/com/nflg/mobilebroken/push/service/SSEManagerBase.java @@ -8,6 +8,7 @@ import com.nflg.mobilebroken.common.util.VUtils; import com.nflg.mobilebroken.push.UserSseEmitter; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.connector.ClientAbortException; import org.springframework.scheduling.TaskScheduler; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -74,7 +75,11 @@ public class SSEManagerBase { }); try { emitter.send(SseEmitter.event().data("已连接").reconnectTime(5000)); - } catch (IOException e) { + }catch (ClientAbortException e){ + log.error("客户端断开连接:{}", userId); + emitter.complete(); + } + catch (IOException e) { log.error("sse发送数据出错", e); emitter.completeWithError(e); } @@ -83,7 +88,7 @@ public class SSEManagerBase { protected void sendByTicket(Integer ticketId, PushMessageDTO dto) { log.info(StrUtil.format(from + "SSE发送消息,工单id: {},内容: {}", ticketId, dto)); - List emitters = SSE_EMITTERS.stream() + List emitters = SSE_EMITTERS.stream() .filter(s -> Objects.equals(s.getTicketId(), ticketId)) .collect(Collectors.toList()); if (CollectionUtil.isEmpty(emitters)){ @@ -93,6 +98,9 @@ public class SSEManagerBase { emitters.forEach(emitter -> { try { emitter.send(SseEmitter.event().name(dto.getType()).data(dto.getData())); + } catch (ClientAbortException e) { + log.error("客户端断开连接:{}", emitter.getUserId()); + emitter.complete(); } catch (IOException e) { log.error("sse发送数据出错", e); emitter.completeWithError(e); @@ -102,7 +110,7 @@ public class SSEManagerBase { protected void sendByUser(Integer userId, PushMessageDTO dto) { log.info(StrUtil.format(from + "SSE发送消息,用户id: {},内容: {}", userId, dto)); - List emitters = SSE_EMITTERS.stream() + List emitters = SSE_EMITTERS.stream() .filter(s -> Objects.equals(s.getUserId(), userId)) .collect(Collectors.toList()); if (CollectionUtil.isEmpty(emitters)) { @@ -113,7 +121,10 @@ public class SSEManagerBase { try { emitter.send(SseEmitter.event().name(dto.getType()).data(dto.getData())); log.info("发送成功"); - } catch (IOException e) { + } catch (ClientAbortException e) { + log.error("客户端断开连接:{}", emitter.getUserId()); + emitter.complete(); + }catch (IOException e) { log.error("sse发送数据出错", e); emitter.completeWithError(e); }