在我的Java 9 Spring Boot 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执行此类定时器拦截的“正确方法”是什么?
答案 0 :(得分:0)
<强> 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
中。可悲的是,这花了我几个小时才发现......希望你能做得更好。