springboot 异步请求响应
时间: 2023-09-09 20:09:11 浏览: 188
自己动手让springboot异步处理浏览器发送的请求(只需要使用ConcurrentLinkedQueue即可)
4星 · 用户满意度95%
在Spring Boot中处理异步请求和响应有多种方式,下面介绍一种常用的方法:
1. 使用`@Async`注解实现异步处理:在方法上添加`@Async`注解,使得该方法在调用时会在新的线程中异步执行。
```java
@RestController
public class MyController {
@Autowired
private MyService myService;
@GetMapping("/async")
public Callable<ResponseEntity<String>> asyncRequest() {
return () -> {
// 异步处理逻辑
String result = myService.processAsync();
return ResponseEntity.ok(result);
};
}
}
@Service
public class MyService {
@Async
public String processAsync() {
// 异步处理逻辑
return "Async response";
}
}
```
在上面的示例中,`MyController`类中的`asyncRequest()`方法使用了`Callable`作为返回类型,这是因为Spring Boot支持将异步处理结果封装为`Callable`对象,以便在异步处理完成后返回给客户端。
2. 使用`DeferredResult`实现异步响应:`DeferredResult`是Spring提供的一个用于异步处理和响应的类。
```java
@RestController
public class MyController {
@Autowired
private MyService myService;
private DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>();
@GetMapping("/async")
public DeferredResult<ResponseEntity<String>> asyncRequest() {
// 设置超时处理
deferredResult.setTimeout(5000);
deferredResult.onTimeout(() -> {
deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT).body("Request timeout"));
});
// 异步处理逻辑
myService.processAsync(deferredResult);
return deferredResult;
}
}
@Service
public class MyService {
@Async
public void processAsync(DeferredResult<ResponseEntity<String>> deferredResult) {
// 异步处理逻辑
String result = "Async response";
deferredResult.setResult(ResponseEntity.ok(result));
}
}
```
在上面的示例中,`MyController`类中的`asyncRequest()`方法返回了一个`DeferredResult`对象,它会在异步处理完成后被设置为响应结果。
以上是两种常用的处理Spring Boot异步请求和响应的方式,你可以根据具体需求选择适合的方式来实现。
阅读全文