Spring Boot Controller 请求超时

在开发 Web 应用程序时,经常会遇到需要处理一些耗时的请求。当请求时间超过预设的时间限制时,我们可能希望让客户端收到一个错误响应,而不是让请求一直挂起。

Spring Boot 提供了一些机制来处理请求超时。本文将介绍如何使用 Spring Boot 控制器来处理请求超时的问题,并提供代码示例。

控制器方法超时设置

在 Spring Boot 中,我们可以使用 @RequestMapping@GetMapping@PostMapping 等注解来定义控制器方法。可以通过设置 timeout 属性来为控制器方法设置超时时间。

@GetMapping("/timeout")
public String handleTimeout() {
    try {
        Thread.sleep(5000); // 模拟耗时操作
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Timeout!";
}

在上面的示例中,我们定义了一个 GET 请求处理方法 /timeout。在方法中,我们使用 Thread.sleep() 方法模拟了一个耗时的操作。如果请求处理时间超过 5 秒钟,将返回字符串 "Timeout!"。

全局超时设置

除了为单个控制器方法设置超时时间,我们还可以在 Spring Boot 应用程序的配置文件中设置全局的超时时间,以便应用程序中所有的请求都遵循这个时间限制。

server.servlet.session.timeout=5s

在上述示例中,我们将超时时间设置为 5 秒钟。这意味着无论是哪个请求,如果处理时间超过了 5 秒钟,都会被视为超时,返回一个错误响应。

异步请求处理

当处理耗时操作时,我们还可以使用异步请求处理来避免阻塞应用程序的其他部分。Spring Boot 提供了 @Async 注解来标记异步处理的方法。

首先,我们需要在启动类上添加 @EnableAsync 注解开启异步处理功能。

@SpringBootApplication
@EnableAsync
public class Application {
    // ...
}

然后,在控制器方法中添加 @Async 注解,并返回 CompletableFuture 类型的结果。

@GetMapping("/async")
@Async
public CompletableFuture<String> handleAsync() {
    try {
        Thread.sleep(5000); // 模拟耗时操作
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return CompletableFuture.completedFuture("Async handled!");
}

在上述示例中,我们使用 @Async 注解标记了 /async 请求处理方法,使其变成异步处理。方法返回 CompletableFuture 类型的结果,表示异步处理的结果。

自定义请求超时处理

如果希望对超时请求进行自定义处理,可以使用 AsyncRestTemplate 来发送异步请求,并设置超时时间。

首先,我们需要在 Maven 或 Gradle 构建文件中添加对 spring-webspring-webmvc 的依赖。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>

然后,可以使用以下代码创建一个 AsyncRestTemplate 实例,并执行异步请求。

AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
URI url = new URI("
RequestCallback callback = new RequestCallback() {
    public void doWithRequest(ClientHttpRequest request) throws IOException {
        // 设置请求参数
    }
};
ResponseExtractor<ResponseEntity<String>> responseExtractor = new ResponseExtractor<ResponseEntity<String>>() {
    public ResponseEntity<String> extractData(ClientHttpResponse response) throws IOException {
        // 处理响应结果
    }
};
ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate.execute(url, HttpMethod.GET, callback, responseExtractor);

在上面的示例中,我们创建了一个 AsyncRestTemplate 实例,并设置了请求的 URL、请求方法、请求参数、响应结果处理方式等。可以根据实际需求进行自定义配置。

总结

本文介绍了如何使用 Spring Boot 控制器处理请求超时的问题。我们可以为单个控制器方法或整个应用程序设置超时时间,还可以使用异步请求处理和自定义请求超时处理来优化应用程序的性能和用户体验。