Scala 如何在Akka中保存请求上下文数据

Scala 如何在Akka中保存请求上下文数据,scala,asynchronous,playframework,akka,Scala,Asynchronous,Playframework,Akka,作为一名长期的Java EE开发人员,我使用了MDC(映射诊断上下文)方法来处理与请求相关的上下文数据的传递,例如,一个唯一的请求令牌,用于跨请求生命周期内发生的许多潜在日志事件跟踪请求 鉴于它依赖于ThreadLocal,很明显,这种方法在使用异步技术时会崩溃 我还处于学习Scala的早期阶段,与这个问题更相关的是Akka。我已经阅读了大量论坛帖子,证实了Akka和MDC的不兼容性,但还没有发现以某种方式模仿MDC方法的一致策略 作为参与者之间发送的消息的一部分,显式地传递这类数据是最好的方法

作为一名长期的Java EE开发人员,我使用了MDC(映射诊断上下文)方法来处理与请求相关的上下文数据的传递,例如,一个唯一的请求令牌,用于跨请求生命周期内发生的许多潜在日志事件跟踪请求

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

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

作为参与者之间发送的消息的一部分,显式地传递这类数据是最好的方法吗?它感觉有点脏,但同时,与轻松缩放的能力兼容


除了直接通过消息之外,还有其他方式将上下文传递给参与者吗?另外,在使用Play 2.0异步块时,有人遇到过同样的挑战吗?

我认为您可以使用在静态上下文中声明的
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
}

每次future将任务提交给调度程序时,将线程安全上下文对象从一个线程复制到另一个线程。因此,您需要一个定制的调度程序-通过任何方式读取
ThreadLocal
,将其存储在executor(调度程序)内部的某个位置,然后提交将首先写入
ThreadLocal

的任务,这是唯一的通信方式(传递信息)参与者之间要发送消息,唯一可用的信息是消息的类型和内容。您不能使用其他渠道隐式传递信息。@drewzilla,您在这个问题上取得过任何进展吗?我还对使用ScalarRelated在整个生命周期中跟踪请求上下文感到好奇: