我准备了一堆请求,希望将这些请求与外部webservice并行发送。在这个流程中,我将继续直接处理响应(例如将某些内容插入数据库)。
问题:我想跟踪最大请求时间(对于一个请求!),不包括处理。但如前所述,这将只跟踪全局时间,包括任何子进程:
StopWatch watch = new StopWatch();
watch.start();
Flux.fromIterable(requests)
.flatMap(req -> webClient.send(req, MyResponse.class)
.doOnSuccess(rsp -> processResponse(rsp))) //assume some longer routine
.collectList()
.block();
watch.stop();
System.out.println(w.getTotalTimeMillis());
问题:如何衡量请求所用的最长时间(不包括 processResponse()
时间?
4条答案
按热度按时间yqkkidmi1#
在mono上使用elapsed时,您将得到一个元组的mono,其中包含elapsed时间和原始对象。你得把它们拆开才能用。我在一个测试中编写了一个示例(代码有点简化),以查看它的工作情况:
输出如下所示:
这些数字表示延迟(在您的示例中是webclient.send())和React管道本身的一点开销。它是在订阅(特定请求的flatmap运行时发生)和下一个信号(在我的情况下是map的结果,在你的情况下是webclient请求的结果)之间计算的
您的代码如下所示:
注意:如果您想使用秒表代替,也可以通过如下操作:
但就我个人而言,我建议使用.elapsed()解决方案,因为它更干净一些。
new9mtju2#
我会用那种方法直接避开秒表。而是创建一个可以在其他地方使用的度量 Package 器。
你可以利用
.doOnSubscribe(), .doOnError(), .doOnSuccess()
但要回答你的问题,你可以有一个这样的计时器u5i3ibmn3#
springboot提供了一个开箱即用的特性,它将为您的应用程序添加插装
WebClient
.您可以使用自动配置的
WebClient.Builder
创建您的WebClient
示例ie。此工具将为您的用户所做的每个api调用计时
WebClient
在你的电脑里注册MeterRegistry
参考文件ycl3bljg4#
一种选择是使用单元测试和
Mockito
模仿方法的行为processResponse()
. 然后你只测量其他任务的时间。假设在类中有以下方法:然后你用
when
方法并模拟返回。在这里你已经摆脱了时间Thread.sleep(20000);
从processResponse
.要在单元测试中使用它,它将如下所示:
所以当你测试你的
YourService
这个stopWatch.start();
以及stopWatch.stop();
应该计算总时间-模拟方法的时间anotherService.processResponse(response))
.