为啥spring boot应用程序的main方法已经返回,但应用程序仍然可以接受请求? [关闭]

Posted

技术标签:

【中文标题】为啥spring boot应用程序的main方法已经返回,但应用程序仍然可以接受请求? [关闭]【英文标题】:Why the main method of spring boot application has returned but the application still can accept requests? [closed]为什么spring boot应用程序的main方法已经返回,但应用程序仍然可以接受请求? [关闭] 【发布时间】:2018-08-23 23:02:48 【问题描述】:

当我在 Intellij IDEA 中调试我的 spring boot 应用程序时,我发现我的 spring 应用程序的 main 方法将返回。当main方法返回表示进程已经结束,spring boot应用怎么还能接受请求呢?

【问题讨论】:

可能是因为它启动了一些让 JVM 保持活动状态的后台线程...? @ErnestKiwele 你知道应用程序在哪里启动那些后台线程吗? 当你启动你的应用程序时,web server/container 由 spring-boot 启动。并且容器具有线程池和许多机制来保持应用程序运行,确切地说是等待传入的请求......您需要在文档中找到如何停止 Spring Boot 应用程序。 @ErnestKiwele 我只是想知道 Spring Boot 应用程序是如何工作的,因为在其他 Web 框架中,例如。 Flask,NodeJs Express,当我们运行app.Run()时,应用程序会阻塞接受请求,这很容易理解,因为三是一个事件循环或者监听器来监听和接受连接,那么应用程序就可以工作了。但是,看来spring boot应用永远不会阻塞监听和接受连接。 【参考方案1】:

当您包含 web-starter 作为应用程序的依赖项时,Spring Boot 知道它必须启动一个嵌入式 servlet 容器(Web 服务器),除非您 explicitly tell him not to do it:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

那么当你这样做时:

@Controller
@EnableAutoConfiguration
public class SampleController 

    @RequestMapping("/")
    @ResponseBody
    String home() 
        return "Hello World!";
    

    public static void main(String[] args) throws Exception 
        SpringApplication.run(SampleController.class, args);
    

SpringApplication.run(SampleController.class, args); 行评估包含的类路径依赖项并检测 Web 依赖项。然后它知道您正在配置一个 Web 应用程序并实例化 servlet 容器,该容器会一直接受请求,直到您明确终止它。

样本:

https://projects.spring.io/spring-boot/

另请参阅:

Spring Boot without the web server

【讨论】:

所以我猜spring boot只是异步启动一个tomcat服务器并将资源复制到服务器的工作目录,然后服务器可以处理这些资源的请求,对吗? 是的,我不确定它是复制资源还是只是配置 tomcat 以将其指向具有其资源的外部工作目录,但这就是它的工作原理。 非常感谢,你把我从困惑中解救了出来。

以上是关于为啥spring boot应用程序的main方法已经返回,但应用程序仍然可以接受请求? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我应该测试 Spring Boot Application 的 main() 方法以及如何测试?

Spring Boot 2.X 实战教程(10)开发人员工具

Spring Boot常用配置

Spring_boot入门

如何测试spring Boot main()方法? [复制]

Spring Boot启动类的run方法