java - java中的同步请求响应

标签 java spring spring-boot request

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

我正在使用带有 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/

相关文章:

java - 命名java类文件的字母来自哪里?

java - JPA/Hibernate 问题(@PrePersist,Session API 说明)

javascript - 使用 HTML 和 Java 创建与 google 相同的搜索框

java - 为什么 Redis 缓存在我的 Spring Boot 应用程序中没有变空?

java - Spring 中的 @Service 与 @Component

Java程序错误,将华氏度转换为摄氏度

sql - 映射用 Hibernate 返回表的 postgres 函数

java - 在自定义 validator Spring Hibernate 中注入(inject) @PersistenceContext

java - jboss 上的 spring boot 应用程序未运行

java - 上传文件时出现 "Could not delete file C:\Users\..."错误