You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot任务应用无法终止,Tomcat报Socket accept failed错误求解决方案

如何移除Spring Boot任务应用中的Tomcat并实现正常终止

当然可以移除Tomcat层,这正是解决你这类任务型Spring Boot应用无法自动终止、手动退出报错问题的标准方案。

问题根源

你的应用之所以表现得像Web应用、无法自动终止,是因为默认引入了spring-boot-starter-web依赖,Spring Boot会自动启动嵌入式Tomcat容器并监听端口,导致应用启动后一直保持运行状态;手动调用SpringApplication.exit()时,Tomcat的Acceptor线程还在监听Socket,主线程关闭通道后就会抛出AsynchronousCloseException。

解决方法

有两种常用方式可以移除Tomcat或禁用Web容器:

1. 调整依赖,移除Web容器相关依赖

如果你的任务应用不需要任何Web相关功能,直接将spring-boot-starter-web替换为基础的spring-boot-starter:

<!-- Maven 配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
// Gradle 配置
implementation 'org.springframework.boot:spring-boot-starter'

如果确实需要保留部分Web相关依赖(比如Spring MVC的某些组件),可以排除Tomcat依赖:

<!-- Maven 配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
// Gradle 配置
implementation('org.springframework.boot:spring-boot-starter-web') {
    exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}

2. 配置应用为非Web类型

如果不想修改依赖,也可以通过配置强制Spring Boot不启动Web容器,在application.properties中添加:

spring.main.web-application-type=none

或者application.yml中:

spring:
  main:
    web-application-type: none

效果验证

修改完成后,你的应用启动时不会再启动Tomcat,执行完run()方法中的任务后会自动终止,不需要手动调用SpringApplication.exit();如果仍需指定退出码,保留原有代码也不会再出现Socket相关的错误。

内容的提问来源于stack exchange,提问作者gene b.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:28:24