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

时间:2018-01-12 13:37:24

标签: java spring rx-java reactive-programming

在我的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执行此类定时器拦截的“正确方法”是什么?

1 个答案:

答案 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中。可悲的是,这花了我几个小时才发现......希望你能做得更好。