gpt4 book ai didi

java - java中的同步请求响应

转载 作者:行者123 更新时间:2023-12-01 22:20:13 26 4
gpt4 key购买 nike

我有一些服务在不同时间提供信息,但我希望某些服务能够同时提供所有答案,尽管它们是不同的服务。

我正在使用带有 spring boot 的 java 11 并使用 api rest,我将在下面留下其中一项服务的示例

@GetMapping(value = "/caract/opcoes/acoes/disponiveis")
public ResponseEntity<List<GroupByData>> getDatasCaractOpcoesAcoesDisponiveis() {
List<GroupByData> result = caractOpcoesAcoesServico.findGroupByIdentityRptDt();
if (result.isEmpty()) {
return new ResponseEntity<List<GroupByData>>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<List<GroupByData>>(result, HttpStatus.OK);
}

如何才能在所有人都准备好后才释放在不同时间发布的多个请求的响应?

最佳答案

有两种方法可以做到这一点。首先我会解释一下响应式和 webflux 的好方法。

@GetMapping(value = "/anothertest")
public Mono<String> rest() {
log.info("request number " + reqCounter++);
CompletableFuture<String> 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<String> sendRequestWithJavaHttpClient() {
return CompletableFuture.supplyAsync(() -> {
// do some logic here
return "hello world.";
});
}

正如我们所说的第一个单声道延迟响应,它将等到时间到来并在之后执行函数调用。这是一个很好的方法,因为使用这种方法不会阻塞响应。所有客户都需要等待。您将需要使用 spring 的 webflux。

第二种不太酷的方法是阻塞线程。这个使用 spring mvc

@GetMapping(value = "/caract/opcoes/acoes/disponiveis*")
public ResponseEntity<Object> 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<Object>("hello world", HttpStatus.OK);
}

这将阻塞服务器线程,直到时间到来。这个问题是tomcat的线程数。默认值是 200,因此,您的应用程序最多可以有 200 个请求,之后 tomcat 无法再接受任何连接。您可以通过更改 application.properties 中的 server.tomcat.max-threads=500 来增加它

您可以在此处找到正在运行的示例代码 https://github.com/ozkanpakdil/spring-examples/tree/master/response-wait-methods

如果你问我对这两种方式的看法,从设计的角度来看并不好,因为客户不应该等待。在时机成熟之前,我会继续回复“NOK”。如果时间合适,就回应实际结果。这样客户端就可以在没有负载的情况下请求尽可能多的请求。并且服务器端不会有任何负载,因为没有任何内容被阻止。

关于java - java中的同步请求响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58596558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com