只是试图在Kleisli中传播我的跟踪上下文,就像最初在下一教程中所做的那样。
object TraceLogger {
def log(msg: String): Kleisli[IO, UUID, Unit] = Kleisli { traceId => IO(println(s"[$traceId] $msg")) }
}
trait ServiceStub {
def request(arg: String): Kleisli[IO, UUID, _]
}
trait ClientStub {
def get(arg: String): Kleisli[IO, UUID, _]
}
case class FirstServiceExample(clientStub: ClientStub) extends ServiceStub {
override def request(arg: String): Kleisli[IO, UUID, _] = Kleisli { (context: UUID) =>
val requestComputation = clientStub.get("calling second service!")
TraceLogger.log(arg)
requestComputation(context)
}
}
case class FirstClientExample(service: FirstServiceExample) {
def request(): IO[_] = {
val traceId = UUID.randomUUID()
service.request("root!").run(traceId)
}
}现在我需要执行死刑:
val exampleClientStub = new ClientStub() {
override def get(arg: String): Kleisli[IO, UUID, _] = Kleisli.ask
}
val exampleClientService = FirstServiceExample(exampleClientStub)
FirstClientExample(exampleClientService).request().unsafeRunSync()但是,不幸的是,我没有看到任何日志。你能帮我找个问题吗?
发布于 2022-02-11 13:30:36
TraceLogger.log(arg) --它返回一个IO,它只是对计算的描述;它什么也不做。
由于您只保留了这个值--它相当于在代码中间有一个1 --它就被简单地丢弃了。
您需要将您的IOs链接在一起,以创建新的IOs,它表示“执行此操作,然后执行该操作”,这基本上就是flatMap方法所做的。
Kleisli { (context: UUID) =>
val requestComputation = clientStub.get("calling second service!")
TraceLogger.log(arg)(context) >> // >> is equivalent to flatMap(_ => )
requestComputation(context)
}(也许有更好的方法来写这个,我不习惯Kliesli__)
Fabio关于"Programas值“的系列文章可能非常有用:https://systemfw.org/archive.html
https://stackoverflow.com/questions/71080822
复制相似问题