关于springboot一个接口请求后,主动取消后,后端是否还在跑

1、最近在思考一个问题,如果一个springboot的请求的接口比较耗时,中途中断该请求后,则后端服务是否会终止该线程的处理,于是写了一个demo

复制代码
 @RequestMapping(value = "/test", method = RequestMethod.GET)
    public BasicResult downloadtest(Long jobId) {

        try {
            logger.info("请求开始,入参:{} ", jobId);
            Thread.sleep(60_000);
            logger.info("请求结束,入参:{} ", jobId);
            return BasicResult.success("处理成功" + jobId);
        } catch (Throwable t) {
            logger.error("接口异常,查询失败,user:{},原因:{},cause by: {}",UserInfoHolder.getUserOa(), t.getMessage(), t);
        }
    }

2、针对改接口进行http请求:

http://localhost:8082/test?jobId=34

3、打印日志如下:

4、发现即使取消请求后,springboot后端还是会进行业务处理,不会自动终止的。

后续总结:

当一个 Spring Boot 应用的请求接口比较耗时,并且客户端在请求中途中断(例如,通过关闭浏览器或发送一个 HTTP 取消请求),后端服务是否会终止该线程的处理取决于多个因素。

  1. 请求类型

    • 对于同步请求,如果客户端关闭了连接,服务器端的线程通常不会立即终止。因为服务器不知道客户端是否已经接收到响应,或者是否还有后续的数据需要发送。
    • 对于异步请求(例如使用 @Async 注解),情况可能有所不同。如果请求被中断,服务器可能会尝试取消任务,但这取决于异步任务的具体实现和取消策略。
  2. 服务器配置

    • 某些服务器配置(如 Tomcat)允许你设置连接超时时间。如果请求超过这个时间还没有完成,服务器可能会自动中断连接并停止处理。
    • 某些服务器或框架可能会提供特定的机制来检测中断的请求并尝试优雅地停止处理。
  3. 请求处理逻辑

    • 开发者编写的代码逻辑也会影响线程的处理。如果代码逻辑中有检测请求中断的逻辑(例如,通过检查请求的属性或异常),那么线程可能会在适当的时候停止处理。
    • 如果代码没有这样的逻辑,线程可能会继续执行,直到完成或遇到其他异常。
  4. 资源考虑

    • 即使请求被中断,如果线程已经消耗了大量资源(如 CPU、内存或数据库连接),那么立即终止线程可能会导致资源浪费。因此,一些系统可能会选择让线程完成其当前的工作,然后优雅地关闭。

总的来说,当客户端中断请求时,后端服务是否会终止线程的处理取决于具体的实现、配置和逻辑。为了处理这种情况,开发者可能需要编写额外的逻辑来检测请求的中断,并适当地停止线程的处理。此外,选择适当的服务器配置和框架也可以帮助管理这种情况。

相关推荐
pan_junbiao12 分钟前
Spring框架的设计模式
java·spring·设计模式
远方160913 分钟前
0x-2-Oracle Linux 9上安装JDK配置环境变量
java·linux·oracle
北执南念18 分钟前
CompletableFuture+线程池使用案列
java
黄交大彭于晏1 小时前
发送文件脚本源码版本
java·linux·windows
钮钴禄·爱因斯晨1 小时前
Java 面向对象进阶之多态:从概念到实践的深度解析
java·开发语言·数据结构
鸽子炖汤1 小时前
Java中==和equals的区别
java·开发语言·jvm
hstar95271 小时前
二、即时通讯系统设计经验
java·架构
风象南2 小时前
SpringBoot的4种死信队列处理方式
java·spring boot·后端
互联网全栈架构3 小时前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
优秀的颜4 小时前
计算机基础知识(第五篇)
java·开发语言·分布式