簡體   English   中英

如何使用來自 Mono 的數據添加延遲?

[英]How do I add a delay with data from the Mono?

我有一項服務正在返回一個包含延遲信息的值。

  public Mono<R> authenticate(
      A authenticationRequest,
      @RequestHeader Map<String, String> headers,
      ServerHttpResponse serverHttpResponse) {

    final AuthServiceResponse<R> authenticationResponse = authService.authenticate(authenticationRequest, headers);
    serverHttpResponse.setStatusCode(authenticationResponse.getStatusCode());
    return Mono.just(authenticationResponse.getOperationResponse())
        .delayElement(authenticationResponse.getDelay());
  }

我想嘗試轉換它,所以它是反應性的,我已經走到這一步了......

  public Mono<R> authenticate(
      A authenticationRequest,
      @RequestHeader Map<String, String> headers,
      ServerHttpResponse serverHttpResponse) {

    return authService.authenticate(authenticationRequest, headers)
            .map(authenticationResponse->{
              serverHttpResponse.setStatusCode(authenticationResponse.getStatusCode());          
              return authenticationResponse.getOperationResponse()
            });
      ...

但我不確定如何添加“delayElement”功能。

您可以在flatMap中使用Mono.fromCallable + delayElement ,如下所示:

return authService.authenticate(authenticationRequest, headers)
         .flatMap(authenticationResponse -> {
           return Mono.fromCallable(() -> authenticationResponse.getOperationResponse())
                      .delayElement(authenticationResponse.getDelay())
            });

需要注意的一件事......在這種情況下您不能將ServerHttpResponse作為參數傳遞,但是您有ServerWebExchange ,其中包含請求和響應以及標頭。 完整的解決方案是

public Mono<R> authenticate(
      @RequestBody SimpleAuthenticationRequest authenticationRequest,
      ServerWebExchange serverWebExchange) {

    return authService
        .authenticate(authenticationRequest, serverWebExchange.getRequest().getHeaders())
        .doOnNext(
            serviceResponse ->
                serverWebExchange.getResponse().setStatusCode(serviceResponse.getStatusCode()))
        .flatMap(
            serviceResponse ->
                Mono.fromCallable(serviceResponse::getOperationResponse)
                    .delayElement(serviceResponse.getDelay()));
}

嘗試根據您的 authenticationResponse.getDelay() 值添加延遲

public Mono<Object> authenticate(Object authenticationRequest,@RequestHeader Object headers,
        Object serverHttpResponse) {

    return authenticate(authenticationRequest,headers)
            .flatMap(authenticationResponse -> {
                Mono<String> delayElement = Mono.just("add delay")
                        .delayElement(Duration.ofSeconds(authenticationResponse.getDelay()));
                Mono<Object> actualResponse =Mono.just(authenticationResponse.getOperationResponse());
                return Mono.zip(delayElement,actualResponse).map(tupleT2 -> tupleT2.getT2());
            });

}

如果它不起作用,請告訴我。 我會嘗試尋找其他方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM