在我的Java9SpringBoot 2应用程序中,我将同步RestTemplate调用的使用转换为异步WebClient调用。同步调用使用HdrHistogram进行计时,如下所示:
long sentAt = System.nanoTime();
try {
ResponseEntity<Resource<Order>> response = restTemplate.exchange(
url,
HttpMethod.POST,
request,
ORDER_PARAMETERIZED_TYPE
);
} finally {
histogram.recordValue(System.nanoTime() - sentAt);
}每个异步调用站点都使用subscribe,因此我可以将这个计时块从实用程序代码移到应用程序代码中,但我真的想避免这种情况。
我想做这样的事情:
long sentAt = System.nanoTime();
return webClient.post()
.uri("/orders")
.body(BodyInserters.fromObject(order))
.retrieve()
.bodyToMono(ORDER_PARAMETERIZED_TYPE)
.doFinally(r -> histogram.recordValue(System.nanoTime() - sentAt))
;但是doOnSuccess调用(需要sentAt值)中的直方图没有记录任何值。
那么,为响应性API执行这种定时器拦截的“正确方法”是什么呢?
发布于 2018-01-12 17:01:35
TLDR
long sentAt = System.nanoTime();
return webClient.post()
.uri("/orders")
.body(BodyInserters.fromObject(order))
.retrieve()
.bodyToMono(ORDER_PARAMETERIZED_TYPE)
.doFinally(r -> histogram.recordValue(System.nanoTime() - sentAt))
;详细信息
实际上,它与问题中所写的一样工作,但是数据出现在HdrHistogram中需要几毫秒时间。可悲的是,这花了我几个小时的discover...hopefully --你会过得更好的。
https://stackoverflow.com/questions/48227418
复制相似问题