gpt4 book ai didi

scala - 未调用 future 的 onComplete 回调

转载 作者:行者123 更新时间:2023-12-03 23:58:29 26 4
gpt4 key购买 nike

我正在尝试按如下方式记录每个任务的耗时。

我遇到的问题是 logElapsedTime 中的回调方法由于某种原因从未被调用。

仅调用 Future f 的最后一个回调。

我该如何解决这个问题,以便正确记录每个耗时?

    def logElapsedTime[T](f: Future[T], description: String): Future[T] = {
val start = System.currentTimeMillis()
f onComplete (_ => logger.debug(s"$description took [${System.currentTimeMillis() - start}]"))
f
}

val f = for {
_ <- logElapsedTime(task1(), "1st task to be executed")
result <- logElapsedTime(task2(), "2nd task to be executed")
_ <- logElapsedTime(task3(), "3rd task to be executed")
_ <- logElapsedTime(task4(), "4th task to be executed")
} yield result

f onComplete {
case Success(v) =>
logger.info(s"tasks succeeded !!!! $v")
case Failure(ex) =>
logger.error(ex.getMessage)
throw ex
}

输出样本 ↓

成功时:

tasks succeeded !!!! some value

失败时:

some error message

没有记录其他输入。
(日志级别设置为debug及以上)

最佳答案

你的逻辑没有问题。我建议您尝试一些修改。

import org.slf4j.LoggerFactory

import scala.concurrent.Future
import concurrent.ExecutionContext.Implicits.global
import scala.io.StdIn
import scala.util.{Failure, Success}

object FutureOnComplete extends App {

private val logger = LoggerFactory.getLogger("test")

def logElapsedTime[T](f: => Future[T], description: String): Future[T] = {
val start = System.currentTimeMillis()
f.onComplete(
_ =>
logger.warn(
s"$description took [${System.currentTimeMillis() - start}]"))
f
}

val f = for {
_ <- logElapsedTime(Future(1), "1st task to be executed")
result <- logElapsedTime(Future(2), "2nd task to be executed")
_ <- logElapsedTime(Future(2), "3rd task to be executed")
_ <- logElapsedTime(Future(2), "4th task to be executed")
} yield result

f.onComplete {
case Success(v) =>
logger.info(s"tasks succeeded !!!! $v")
case Failure(ex) =>
logger.error(ex.getMessage)
throw ex
}

StdIn.readLine()

}
  • 将日志级别提高到 warn 以确保您的日志记录不会受到指责。或者替换为 println
  • 例如,在您的主线程中等待将来使用 StdIn.readLine() 完成。这允许异步进程完成并运行 onComplete。
  • 通过名称参数使用 => Future[T] 开始在方法 logElapsedTime 中执行 future。这只会在未来开始时改变,但不会改变日志记录的逻辑

关于scala - 未调用 future 的 onComplete 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407258/

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