Java 如何为反应式API构造计时器?
在我的Java9SpringBoot2应用程序中,我将同步Java 如何为反应式API构造计时器?,java,spring,rx-java,reactive-programming,Java,Spring,Rx Java,Reactive Programming,在我的Java9SpringBoot2应用程序中,我将同步RestTemplate调用转换为异步WebClient调用。同步调用使用HdrHistogram进行计时,如下所示: long sentAt = System.nanoTime(); try { ResponseEntity<Resource<Order>> response = restTemplate.exchange( url, HttpMethod.POST,
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);
}
但是doOnSuccess
调用中的直方图(需要sentAt
值)没有记录任何值
那么,对反应式API进行此类计时器拦截的“正确方法”是什么呢?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
中需要几毫秒。遗憾的是,我花了几个小时才发现……希望你会过得更好
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))
;