Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为反应式API构造计时器?_Java_Spring_Rx Java_Reactive Programming - Fatal编程技术网

Java 如何为反应式API构造计时器?

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,

在我的Java9SpringBoot2应用程序中,我将同步
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))
    ;