gpt4 book ai didi

spring - 执行时间响应式编程

转载 作者:行者123 更新时间:2023-12-03 16:04:37 28 4
gpt4 key购买 nike

这是在响应式(Reactive)编程中找到方法( getFavouriteDetails() )的执行时间的理想方法吗?

public List<Favourites> getFavouriteDetails(String userId){
userService.getFavorites(userId)
.flatMap(favoriteService::getDetails)
.switchIfEmpty(suggestionService.getSuggestions())
.take(5)
.publishOn(UiUtils.uiThreadScheduler())
.subscribe(uiList::show, UiUtils::errorPopup)
.flatMap(a -> Mono.subscriberContext().map(ctx -> {
log.info("Time taken : " + Duration.between(ctx.get(key), Instant.now()).toMillis() + " milliseconds.");
return a;
}))
.subscriberContext(ctx -> ctx.put(key, Instant.now()))
}

最佳答案

两种方法可确保您仅在订阅时测量执行时间 -

  • 使用 flatMapMany 在 Flux 周围包裹 Mono .这也返回一个 Flux 。
  • 使用 AtomicReference,在 onSubscribe 中设置时间并在 doFinally 中记录耗时.

  • 示例代码 -
    timeFluxV1(getFavouriteDetails(userId)).subscribe(uiList::show, UiUtils::errorPopup);

    timeFluxV1(getFavouriteDetails(userId)).subscribe(uiList::show, UiUtils::errorPopup);

    private <T> Flux<T> timeFluxV1(Flux<T> flux) {
    return Mono.fromSupplier(System::nanoTime)
    .flatMapMany(time -> flux.doFinally(sig -> log.info("Time taken : " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - time) + " milliseconds.")));
    }


    private <T> Flux<T> timeFluxV2(Flux<T> flux) {
    AtomicReference<Long> startTime = new AtomicReference<>();
    return flux.doOnSubscribe(x -> startTime.set(System.nanoTime()))
    .doFinally(x -> log.info("Time taken : " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime.get()) + " milliseconds."));
    }

    public Flux<Favourites> getFavouriteDetails(String userId) {
    return userService.getFavorites(userId)
    .flatMap(favoriteService::getDetails)
    .switchIfEmpty(suggestionService.getSuggestions())
    .take(5)
    .publishOn(UiUtils.uiThreadScheduler());
    }

    关于spring - 执行时间响应式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51199908/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com