如何解决通过CompletableFuture的Spring-boot异步控制器实现同步
我创建了2个spring-boot服务:慢服务和网关 slow-service 是一种服务,它可以反转字符串,但执行速度非常慢。
@Service
public class SlowReverseService implements ReverseService {
@Override
public String reverse(String message) {
StringBuilder builder = new StringBuilder(message);
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
return builder.reverse().toString();
}
}
和控制器:
@RestController
public class SlowController {
private final ReverseService reverseService;
public SlowController(ReverseService reverseService) {
this.reverseService = reverseService;
}
@GetMapping(value = "/reverse/{message}")
public String reverseMessage(@PathVariable("message") String message){
return reverseService.reverse(message);
}
}
网关使用慢速服务并返回异步结果。
@Service
public class AsyncReverseService implements ReverseService {
@Async
@Override
public CompletableFuture<String> reverse(String message) {
RestTemplate restTemplate = new RestTemplate();
return CompletableFuture.completedFuture(
restTemplate.getForObject("http://localhost:8081/reverse/" + message,String.class));
}
}
和控制器:
@RestController
public class GatewayController {
private final ReverseService reverseService;
public GatewayController(ReverseService reverseService) {
this.reverseService = reverseService;
}
@GetMapping(value = "/reverse/{message}")
public CompletableFuture<String> reverseMessage(@PathVariable("message") String message) {
String name = Thread.currentThread().getName();
System.out.println(new Date() + ":" + name);
return reverseService.reverse(message);
}
}
我在网关的属性中设置此参数:server.tomcat.threads.max=2
我尝试向网关发送6个请求,并查看以下日志:
Thu Aug 13 10:59:28 MSK 2020:http-nio-8080-exec-1
Thu Aug 13 10:59:29 MSK 2020:http-nio-8080-exec-2
Thu Aug 13 10:59:58 MSK 2020:http-nio-8080-exec-1
Thu Aug 13 10:59:59 MSK 2020:http-nio-8080-exec-2
Thu Aug 13 11:00:28 MSK 2020:http-nio-8080-exec-1
Thu Aug 13 11:00:29 MSK 2020:http-nio-8080-exec-2
我的网关控制器收到2个请求,并将其发送到慢速服务。慢速服务工作30秒,然后将结果返回到网关。网关可以处理接下来的2个请求。网关每30秒可以处理2个请求。
我期望另一种行为:网关收到2个请求并将其委托给CompletableFuture。并释放线程。并且可以接收接下来的2个请求。连接增加,但我的2个线程始终可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。