在Java中同步请求响应

问题描述 投票:0回答:1

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

我将使用带有春季启动程序的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);
} 

我如何才能释放每个人都准备好之后才在不同时间释放的几个请求的响应?

java spring spring-boot request
1个回答
0
投票

有两种方法可以做到这一点。首先,我将解释反应性和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

如果从设计的角度来看,我对这两种方法的看法不好,因为客户不应等待。我会回应,直到时间到来。如果时间合适,那就回应真实的结果。这样,客户端可以在没有负载的情况下请求任意数量的请求。并且服务器端将不会有任何负载,因为没有东西被阻止。

© www.soinside.com 2019 - 2024. All rights reserved.