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

Spring Boot接口添加延迟后出现连接超时问题求助

问题分析与解决方案

问题定位

首先明确:你遇到的java.net.ConnectException并非Postman调用接口时的连接超时,而是接口内部通过SSHJ库发起SSH连接时出现的超时异常。Postman提示的"socket hang up"是因为接口长时间未返回响应,客户端主动断开;IntelliJ无异常输出大概率是异常被代码吞掉,未触发Spring的异常打印机制。

你添加的5秒延迟(尤其是空循环这种高CPU占用的方式)占用了请求处理线程,导致内部SSH连接的超时窗口被挤压,线程阻塞期间网络资源调度受影响,最终引发连接失败。

排查与修复步骤

1. 替换空循环为标准阻塞方法

空循环会持续占用CPU,导致线程处于繁忙状态,严重影响后续网络操作,优先用Thread.sleep或TimeUnit.SECONDS.sleep替代:

@PostMapping(value="/api/stt", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity endPoint(@RequestBody String payload) throws Exception {
    // 替换空循环为标准延迟
    TimeUnit.SECONDS.sleep(5);
    // 后续业务逻辑(包括SSH连接)
    ...
}

2. 给SSH连接配置合理超时

在SSHJ的连接代码中显式设置更长的超时时间,避免因主线程延迟导致连接超时:

SSHClient sshClient = new SSHClient();
// 设置连接超时为10秒(大于你的5秒延迟)
sshClient.setConnectTimeout(10000);
try {
    sshClient.connect("你的目标主机地址");
    // 后续SSH操作
} catch (IOException e) {
    // 强制打印异常栈,避免被吞
    e.printStackTrace();
    throw e;
}

3. 确保异常被捕获并打印

在接口方法中显式捕获所有异常并打印堆栈,或配置Spring全局异常处理器,防止异常静默消失:

@PostMapping(value="/api/stt", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity endPoint(@RequestBody String payload) {
    try {
        TimeUnit.SECONDS.sleep(5);
        // SSH连接及业务逻辑
        return ResponseEntity.ok("处理完成");
    } catch (Exception e) {
        // 打印完整异常栈到控制台
        e.printStackTrace();
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }
}

4. 异步化阻塞操作(生产环境必做)

Spring Boot请求线程池容量有限,大量阻塞请求会耗尽线程导致服务不可用,建议将延迟及SSH操作放到异步线程处理:

@PostMapping(value="/api/stt", produces = MediaType.APPLICATION_JSON_VALUE)
public CompletableFuture<ResponseEntity> endPoint(@RequestBody String payload) {
    return CompletableFuture.supplyAsync(() -> {
        try {
            TimeUnit.SECONDS.sleep(5);
            // 执行SSH连接逻辑
            return ResponseEntity.ok("处理完成");
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
        }
    });
}

5. 调整客户端超时

在Postman中延长请求超时时间(设置为>5秒),可以收到接口返回的异常信息,进一步辅助排查问题。

内容的提问来源于stack exchange,提问作者user3857331

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:02:46