通过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 (将#修改为@)