9

作为一名长期的 Java EE 开发人员,我使用 MDC(映射诊断上下文)方法来处理与请求相关的上下文数据的传递,例如,用于跟踪在该请求的生命周期。

鉴于它依赖于 ThreadLocal,很明显这种方法在使用异步技术时会崩溃。

我仍处于学习 Scala 的早期阶段,与这个问题更相关的是 Akka。我阅读了大量论坛帖子,确认 Akka 和 MDC 不兼容,但尚未发现以某种方式模仿 MDC 方法的一致策略。

将此类数据作为在参与者之间发送的消息的一部分显式传递是最好的吗?它有点脏,但同时与轻松扩展的能力兼容。

除了直接通过消息之外,还有其他方法可以将上下文传递给 Actor 吗?另外,有没有人在使用 Play 2.0 Async 块时遇到过同样的挑战?

4

1 回答 1

1

我认为您可以ThreadLocal在静态上下文中使用 -s 声明,与此代码中的 executor 隐式参数相同:

implicit val executor = context.dispatcher
val f = Future[Boolean] {
  someTask()
} andThen { 
  case err if err.isLeft => log.error("Some error: " + err.left.get); false
  case ok if ok.isRight => log.info("Good work: " + ok.right.get); true
}

每次未来向调度程序提交任务时,将线程安全上下文对象从一个线程复制到另一个线程。因此,您需要一个自定义调度程序-无论如何读取ThreadLocal,将其存储在执行程序(调度程序)内部的某个位置,然后提交将首先写入的任务ThreadLocal

于 2012-11-25T00:02:57.193 回答