有两种方法可以做到这一点。首先,我将解释反应性和webflux的好方法。@GetMapping(value = "/anothertest")
public Mono rest() {
log.info("request number " + reqCounter++);
CompletableFuture stringCompletableFuture = sendRequestWithJavaHttpClient().thenApply(x -> "test: " + x);
Duration between = Duration.between(
LocalTime.now(),
LocalTime.parse("14:01:00")// I am assuming there is a time we send data back
);
return Mono.first(Mono.delay(between)).then(Mono.fromFuture(stringCompletableFuture));
}
private CompletableFuture sendRequestWithJavaHttpClient() {
return CompletableFuture.supplyAsync(() -> {
// do some logic here
return "hello world.";
});
}
正如我们对第一个单声道所说,要延迟响应,它将等待时间到来,然后再进行函数调用。这是很好的方法,因为通过这种方法,不会阻塞响应。所有客户都需要等待。您将需要使用spring的webflux。
第二种也不酷的方法是阻塞线程。这个用spring mvc@GetMapping(value = "/caract/opcoes/acoes/disponiveis*")
public ResponseEntity getDatasCaractOpcoesAcoesDisponiveis() throws Exception {
log.info("request number " + reqCounter++);
Duration between = Duration.between(
LocalTime.now(),
LocalTime.parse("14:10:00")
);
log.info("will sleep "+between.toMillis());
Thread.sleep(between.toMillis());
return new ResponseEntity("hello world", HttpStatus.OK);
}
这将阻塞服务器线程,直到时间到了。关于这个的问题是tomcat的线程数。默认值为200,因此您的应用程序最多可以有200个请求,之后,tomcat将无法再建立连接。您可以通过在application.properties中更改server.tomcat.max-threads = 500来增加它
如果从设计的角度来看,我对这两种方法的看法不好,因为客户不应等待。我会回应,直到时间到来。如果时间合适,那就回应真实的结果。这样,客户端可以在没有负载的情况下请求任意数量的请求。并且服务器端将不会有任何负载,因为没有东西被阻止。