在java中同步请求响应

在java中同步请求响应,java,spring,spring-boot,request,Java,Spring,Spring Boot,Request,我有一些在不同时间提供信息的服务,但我希望有些服务能够同时提供所有答案,尽管服务不同 我将Java11与SpringBoot一起使用,并使用api rest,我将在下面给出其中一个服务的示例 @GetMapping(value = "/caract/opcoes/acoes/disponiveis") public ResponseEntity<List<GroupByData>> getDatasCaractOpcoesAcoesDisponiveis() {

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

我将Java11与SpringBoot一起使用,并使用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);
} 
@GetMapping(value=“/caract/opcoes/acos/disponiveis”)
公共响应GetDatascaractopcoescoesdocesdisponiveis(){
列表结果=caractopcoescoesservico.findGroupByIdentityRptDt();
if(result.isEmpty()){
返回新的响应属性(HttpStatus.NO_内容);
}
返回新的响应状态(结果,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.";
    });
}
@GetMapping(value=“/anothertest”)
公共休息室{
log.info(“请求编号”+reqCounter++);
CompletableFuture stringCompletableFuture=sendRequestWithJavaHttpClient()。然后应用(x->“测试:+x);
持续时间间隔=持续时间(
LocalTime.now(),
parse(“14:01:00”)//我假设有一段时间我们会发回数据
);
首先返回Mono.first(Mono.delay(between)),然后返回Mono.fromFuture(stringCompletableFuture));
}
私有CompletableFuture sendRequestWithJavaHttpClient(){
返回CompletableFuture.SupplySync(()->{
//在这里做一些逻辑
返回“你好,世界。”;
});
}
正如我们对第一个mono所说的,它将延迟响应,直到时间到来,然后执行函数调用。这是一种很好的方法,因为使用这种方法不会阻塞响应。所有客户都需要等待。您需要使用spring的webflux

第二个也是不酷的方法就是堵线。这一个使用SpringMVC

@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);
}
@GetMapping(value=“/caract/opcoes/acos/disponiveis*”)
public ResponseEntity GetDatascaractoPCoesCoesCoesDisponiveis()引发异常{
log.info(“请求编号”+reqCounter++);
持续时间间隔=持续时间(
LocalTime.now(),
解析(“14:10:00”)
);
log.info(“will sleep”+between.toMillis());
Thread.sleep(在.toMillis()之间);
返回新的ResponseEntity(“HelloWorld”,HttpStatus.OK);
}
这将阻止服务器线程,直到时间到来。这方面的问题是tomcat的线程数。默认值为200,因此您的应用程序最多可以有200个请求,此后tomcat将无法再进行连接。您可以通过在application.properties中更改server.tomcat.max threads=500来增加它

您可以在这里找到正在运行的示例代码


如果你问我对这两种方法的看法,从设计的角度来看是不好的,因为客户不应该等待。我会一直支持诺克,直到时机成熟。如果时间是好的,就回应真实的结果。这样,客户端可以在不加载的情况下请求任意多的数据。服务器端不会有任何负载,因为没有任何东西被阻止。

您能更好地解释一下“发布多个请求的响应”部分吗?不同时间的服务发布信息只想在每个人都正常的情况下发布信息