如何在 Reactor Netty HttpSever 响应中添加延迟

How to add delay in Reactor Netty HttpSever response

我创建了一个工作正常的 Reactor Netty HTTPSever,我想为每个响应添加一个延迟,即如果我发送一个请求,我应该在 10 秒后得到响应,我需要这个延迟来测试一些东西。下面是用于创建服务器的代码

 DisposableServer server = HttpServer.create().port(port).protocol(HttpProtocol.H2C).metrics(true, s -> s)
                .wiretap(false).handle((request, response) -> response.status(httpResponseStatus).send()).bindNow();

server.onDispose().block();

send() 方法 returns Mono,因此您可以调用 Mono 提供的 delay* 运算符。上面的例子可以改成这样(下面这个例子延迟 headers 并发送一个空响应 body):

DisposableServer server = 
            HttpServer.create()
                      .port(port)
                      .protocol(HttpProtocol.H2C)
                      .metrics(true, s -> s)
                      .wiretap(false)
                      .handle((request, response) ->
                          response.status(httpResponseStatus)
                                  .send()
                                  .delaySubscription(Duration.ofSeconds(10)))
                      .bindNow();
            
server.onDispose().block();

更新: 如果 I/O 处理程序需要先延迟然后发送一些非空响应,示例可以更改为以下示例:

DisposableServer server = 
            HttpServer.create()
                      .port(port)
                      .protocol(HttpProtocol.H2C)
                      .metrics(true, s -> s)
                      .wiretap(false)
                      .handle((request, response) ->
                          Mono.delay(Duration.ofSeconds(10))
                              .flatMap(l -> {
                                  // Set status code if needed
                                  response.status(httpResponseStatus);
                                  return response.sendString(Mono.just(String.valueOf(responseCode)).then();
                              }))
                      .bindNow();
                
server.onDispose().block();