From 088e1ba6624c7523ee2566110b2c4721a37204a5 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 09 四月 2026 14:22:09 +0800
Subject: [PATCH] #生成波次

---
 rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java
index 558bec6..ea691e6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/exception/GlobalExceptionHandler.java
@@ -12,6 +12,7 @@
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.context.request.async.AsyncRequestNotUsableException;
 
 import jakarta.servlet.http.HttpServletResponse;
 import java.util.regex.Matcher;
@@ -79,10 +80,18 @@
         return R.error(out);
     }
 
+    @ExceptionHandler(AsyncRequestNotUsableException.class)
+    public void asyncRequestNotUsableExceptionHandler(AsyncRequestNotUsableException e) {
+        logger.warn("Client connection aborted: {}", resolveAbortMessage(e));
+    }
 
     @ResponseBody
     @ExceptionHandler(RuntimeException.class)
     public R runtimeExceptionHandler(RuntimeException e, HttpServletResponse response) {
+        if (isClientAbortException(e)) {
+            logger.warn("Client connection aborted: {}", resolveAbortMessage(e));
+            return null;
+        }
         CommonUtil.addCrossHeaders(response);
         Throwable cause = e.getCause();
         if (cause instanceof CoolException) {
@@ -95,10 +104,44 @@
     @ResponseBody
     @ExceptionHandler(Throwable.class)
     public R exceptionHandler(Throwable e, HttpServletResponse response) {
+        if (isClientAbortException(e)) {
+            logger.warn("Client connection aborted: {}", resolveAbortMessage(e));
+            return null;
+        }
         logger.error(e.getMessage(), e);
         CommonUtil.addCrossHeaders(response);
         return R.error(Constants.RESULT_ERROR_MSG);
     }
 
+    private boolean isClientAbortException(Throwable throwable) {
+        Throwable current = throwable;
+        while (current != null) {
+            String message = current.getMessage();
+            if (message != null) {
+                String normalized = message.toLowerCase();
+                if (normalized.contains("broken pipe")
+                        || normalized.contains("connection reset")
+                        || normalized.contains("forcibly closed")
+                        || normalized.contains("abort")) {
+                    return true;
+                }
+            }
+            current = current.getCause();
+        }
+        return false;
+    }
+
+    private String resolveAbortMessage(Throwable throwable) {
+        Throwable current = throwable;
+        while (current != null) {
+            String message = current.getMessage();
+            if (message != null && !message.isBlank()) {
+                return message;
+            }
+            current = current.getCause();
+        }
+        return "client aborted connection";
+    }
+
 }
 

--
Gitblit v1.9.1