前端Vue3 + 后端Spring Boot,前端取消請求后端處理邏輯分析

在?Vue3 + Spring Boot?的技術棧下,前端取消請求后,后端是否繼續執行業務邏輯的答案仍然是?取決于請求處理的階段?和?Spring Boot 的實現方式。以下是結合具體技術的詳細分析:


1.?請求未到達 Spring Boot

  • 場景:前端通過?AbortController?取消請求(如?axios?的?signal),但請求尚未到達服務器。

  • 結果:Spring Boot 完全不會收到該請求,業務邏輯不會執行。


2.?請求已到達 Spring Boot

  • 場景:請求已進入 Spring Boot 的?Controller?層并開始處理。

  • 結果默認情況下,Spring Boot 會繼續執行完業務邏輯。原因:

    1. HTTP 協議特性:Spring Boot 無法主動感知客戶端是否斷開連接(除非顯式監聽)。

    2. 線程模型:Spring Boot 默認使用線程池處理請求,一旦任務提交到線程池,即使客戶端斷開,線程仍會繼續執行任務。

  • 示例代碼

    java

    復制

    下載

    @PostMapping("/submit")
    public ResponseEntity<String> submitData(@RequestBody Data data) {// 假設這是一個耗時操作(如數據庫寫入)someLongRunningService.process(data);return ResponseEntity.ok("Success");
    }

    即使前端取消請求,someLongRunningService.process(data)?仍會執行完畢。


3.?如何讓 Spring Boot 終止處理?

  • 需要顯式監聽客戶端斷開事件,結合 Spring Boot 的異步機制實現:

方案 1:使用?DeferredResult?監聽連接狀態

復制

下載

 ```java@PostMapping("/submit")public DeferredResult<String> submitData(@RequestBody Data data) {DeferredResult<String> deferredResult = new DeferredResult<>();// 監聽客戶端斷開事件deferredResult.onTimeout(() -> {// 執行終止邏輯(如關閉數據庫連接、中斷線程等)cleanup();});// 異步執行業務邏輯CompletableFuture.runAsync(() -> {someLongRunningService.process(data);deferredResult.setResult("Success");});return deferredResult;}```- **優點**:通過 `DeferredResult.onTimeout()` 或 `onCompletion()` 監聽客戶端斷開。- **缺點**:需要手動終止異步任務(如調用線程中斷)。
方案 2:結合響應式編程(WebFlux)

復制

下載

 如果使用 **Spring WebFlux**(非阻塞異步模型),可通過響應式流控制中斷:```java@PostMapping("/submit")public Mono<String> submitData(@RequestBody Data data) {return Mono.fromCallable(() -> someLongRunningService.process(data)).timeout(Duration.ofSeconds(30)) // 設置超時.doOnCancel(() -> cleanup());    // 監聽取消事件}```- **優點**:天然支持非阻塞中斷。- **缺點**:需要重構為響應式代碼。
方案 3:自定義線程中斷

復制

下載

 在業務邏輯中檢查線程中斷狀態:```javapublic void process(Data data) {while (!Thread.currentThread().isInterrupted()) {// 執行可中斷的任務}}```在客戶端斷開時,調用 `Thread.interrupt()` 終止任務(需結合 `DeferredResult` 使用)。

4.?關鍵注意事項

  • 資源泄漏風險
    如果客戶端斷開后未正確終止數據庫連接、文件句柄等資源,可能導致資源泄漏。

  • 數據一致性
    對于支付、訂單等關鍵操作,即使前端取消,后端可能已完成處理。需通過以下方式保證一致性:

    1. 冪等性設計:通過唯一請求 ID 避免重復處理。

    2. 狀態查詢接口:前端取消后,輪詢后端狀態確認是否成功。

    3. 事務回滾:在監聽到客戶端斷開時,手動回滾事務(需結合?@Transactional)。


5.?總結

場景是否繼續執行解決方案建議
請求未到達 Spring Boot無需處理
請求到達且正在處理(默認)使用?DeferredResult?或 WebFlux
請求到達且已監聽客戶端斷開可終止顯式中斷線程或清理資源

推薦方案

  • 對耗時操作(如文件上傳、復雜計算),使用?DeferredResult?+ 線程中斷?實現可終止邏輯。

  • 對關鍵業務(如支付),通過?冪等性 + 狀態查詢?確保數據一致性。

實例調試代碼:

AsyncConfig.java

package com.weiyu.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
public class AsyncConfig {@Bean(name = "asyncTaskExecutor") // 明確指定Bean名稱public ThreadPoolTaskExecutor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 核心線程數 = CPU核心數 + 1executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() + 1);executor.setMaxPoolSize(50);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Async-QueryTask-");executor.initialize(); // 必須初始化!!!return executor;}
}
TaskMessageController.java
// 正確注入方式@Qualifier("asyncTaskExecutor")@Autowiredprivate Executor asyncTaskExecutor;@GetMapping("/task")public DeferredResult<Result<List<Task>>> queryTask(){DeferredResult<Result<List<Task>>> deferredResult = new DeferredResult<>();// 監聽客戶端斷開事件deferredResult.onTimeout(() -> {deferredResult.setErrorResult(Result.error("請求超時"));});// 使用自定義線程池(推薦)或公共池執行異步任務CompletableFuture.supplyAsync(() -> {// 這里執行實際業務邏輯List<Task> taskList = taskMessageService.queryTask();// 防御性空值檢查if (taskList == null) {return Result.error("服務返回空結果");}return Result.success(taskList);}, asyncTaskExecutor).whenComplete((result, ex) -> {if (ex != null) {// 異常處理deferredResult.setErrorResult(Result.error(ex.getMessage()));} else {// 正常返回結果deferredResult.setResult(result);}});return deferredResult;}

?

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

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

相關文章

【藍橋杯省賽真題58】Scratch畫臺扇 藍橋杯scratch圖形化編程 中小學生藍橋杯省賽真題講解

目錄 scratch畫臺扇 一、題目要求 編程實現 二、案例分析 1、角色分析 2、背景分析 3、前期準備 三、解題思路 四、程序編寫 五、考點分析 六、推薦資料 1、scratch資料 2、python資料 3、C++資料 scratch畫臺扇 第十五屆青少年藍橋杯scratch編程省賽真題解析 …

GPT-4o 圖像生成與八個示例指南

什么是GPT-4o圖像生成&#xff1f; 簡單來說&#xff0c;GPT-4o圖像生成是集成在ChatGPT內部的一項功能。用戶可以直接在對話中&#xff0c;通過文本描述&#xff08;Prompt&#xff09;來創建、編輯和調整圖像。這與之前的圖像生成工具相比&#xff0c;體驗更流暢、交互性更強…

TCP 連接的“三次握手”與“四次揮手”

目錄 什么是“三次握手” “四次揮手”&#xff1f; 三個標記位 三次握手 四次揮手 為什么握手三次&#xff0c;揮手需要四次&#xff1f; 為什么要等2MSL&#xff1f; 什么是“三次握手” “四次揮手”&#xff1f; 三次握手&#xff08;Three-way Handshake&#xf…

力扣刷題 -- 206.反轉鏈表

題目&#xff1a; 方法一&#xff1a;創建新鏈表&#xff0c;遍歷舊鏈表&#xff0c;進行頭插 代碼實現&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struc…

Vue 中的過渡效果與響應式數據:transition、transitiongroup、reactive 和 ref 詳解

在 Vue 開發過程中&#xff0c;為應用添加過渡效果和處理響應式數據是提升用戶體驗和實現動態交互的關鍵。 一、transition&#xff1a;元素的單元素過渡效果 transition是 Vue 提供的內置組件&#xff0c;專門用于為單個元素或組件添加過渡動畫。它會在元素插入、更新或移除…

文章七《深度學習調優與超參數優化》

&#x1f680; 文章7&#xff1a;深度學習調優與超參數優化——你的AI模型需要一場"整容手術" 一、模型調優核心策略&#xff1a;像調整游戲裝備一樣優化模型 1. 學習率調整&#xff1a;掌控訓練的"油門踏板" 比喻&#xff1a;把模型訓練想象成賽車游戲&…

Python裝飾器執行時機詳解:模塊加載時的魔法

裝飾器執行的基本原理 Python裝飾器在程序運行過程中遵循獨特的執行邏輯&#xff0c;其核心特性體現在模塊加載階段的即時執行。通過示例7-2的registration.py 模塊&#xff0c;我們可以清晰觀察到裝飾器與函數執行的時序差異。 registry []def register(func):print(runnin…

基于隨機森林的糖尿病預測模型研究應用(python)

基于隨機森林的糖尿病預測模型研究應用 1、導入糖尿病數據集 In [14]: import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt datapd.read_csv(./糖尿病數據集.csv,encoding"gbk") data.head()#查看前五行數據Out[14]:…

【Web應用服務器_Tomcat】二、Tomcat 核心配置與集群搭建

在企業級 Java Web 應用的部署場景中&#xff0c;Tomcat 作為主流的 Servlet 容器和 Web 服務器&#xff0c;其核心配置的優化以及集群搭建對于保障應用的高性能、高可用性至關重要。 一、Tomcat 核心配置優化? 1.1 server.xml 配置文件解析? Tomcat 的核心配置文件server…

Linux(文件管理)

文件命名規則 除了字符“/”之外&#xff0c;所以的字符都可以使用&#xff0c;但要注意&#xff0c;在目錄名或文件名中&#xff0c;不建議使用某些特殊字符&#xff0c;如&#xff1a;<、>、?、*等 如果一個文件名中包含了特殊字符&#xff0c;例如空格&#xff0c;那…

Windows服務器部署全攻略:Flask+Vue+MySQL跨平臺項目實戰(pymysql版)

當你的后端(Flask+pymysql,Windows開發)與前端(Vue,Mac開發)需要統一部署到Windows服務器時,通過「IIS反向代理+原生組件適配」方案可實現穩定交互。以下是針對Windows環境的專屬部署指南,解決路徑適配、服務啟動等核心問題。 一、Windows服務器環境準備(必做!) 1…

wpf 輸入框 在輸入時去除水印

wpf ScrollViewer 在輸入數據時去除水印 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;ScrollViewer控件通常用于顯示滾動內容。如果你想在ScrollViewer中使用數據輸入&#xff08;例如文本輸入&#xff09;&#xff0c;并且希望在輸入時去除水…

動態思維——AI與思維模型【91】

一、定義 動態思維思維模型是一種強調在思考問題和分析情況時&#xff0c;充分考慮到事物的變化性、發展性和相互關聯性&#xff0c;不局限于靜態的、孤立的視角&#xff0c;而是以發展變化的眼光看待事物&#xff0c;能夠根據不同時間、環境和條件的變化&#xff0c;靈活調整…

多模態大語言模型arxiv論文略讀(五十五)

MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ?? 論文標題&#xff1a;MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ?? 論文作者&#xff1a;Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…

Go-web開發之帖子功能

帖子功能 route.go r.Use(middleware.JWTAuthMiddleware()){r.POST("/post", controller.CreatePostHandler)r.GET("/post/:id", controller.GetPostDetailHandler)}post.go 定義帖子結構 type Post struct {Id int64 json:"id" …

C++ 項目中的多語言字符串管理方案(支持自動提示與動態加載)

&#x1f4ac; C 項目中的多語言字符串管理方案&#xff08;支持自動提示與動態加載&#xff09; 在中大型 C 應用中&#xff0c;我們常常會面臨界面提示文本繁多、需要支持多語言切換的問題。為了解決字符串管理混亂、缺乏自動提示、難以維護等問題&#xff0c;本文將提供一種…

數控滑臺:將制造業推向智能化的關鍵裝備

隨著制造業的不斷發展和智能化進程的加速推進&#xff0c;數控滑臺作為一種關鍵的裝備&#xff0c;在各種工業生產中發揮著越來越重要的作用。數控滑臺不僅提高了生產效率&#xff0c;節約了人力物力資源&#xff0c;還大大降低了生產過程中的錯誤率&#xff0c;保障了產品的質…

【STM32】定時器輸入捕獲

STM32 定時器輸入捕獲功能筆記 一、什么是輸入捕獲&#xff08;Input Capture&#xff09; 輸入捕獲是利用定時器的輸入通道&#xff0c;在檢測到信號電平變化&#xff08;如上升沿或下降沿&#xff09;時&#xff0c;立即將當前計數器的值捕獲并保存到捕獲寄存器&#xff08…

Qt通過QXlsx庫文件寫入到excl文件,讀取excl文件

第一&#xff1a;下載QXlsx庫文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt項目中引入QXlsx庫&#xff0c;需要把QXlsx庫文件放在項目文件夾下 第三&#xff1a;將tableview中的數據存入到excl文件 代碼&#xff1a; void MainWindow…

【KWDB 創作者計劃】一款面向 AIoT 的多模數據庫實戰體驗

一、KWDB&#xff1a;AIoT 時代的數據庫新選擇 KWDB 是由開放原子開源基金會孵化的分布式多模數據庫&#xff0c;專為物聯網、工業互聯網等場景設計。其核心價值在于時序與關系數據融合處理能力&#xff1a; ?多模統一引擎?&#xff1a;單個實例可同時建立時序庫&#xff08…