【发布时间】:2016-02-16 16:24:00
【问题描述】:
与我发布的另一个问题有关 (scala futures - keeping track of request context when threadId is irrelevant) 在调试未来时,调用堆栈的信息量不是很大(因为调用上下文通常在另一个线程和另一个时间)。 当可能存在通向相同未来代码的不同路径时,这尤其成问题(例如从代码中的许多地方调用的 DAO 的使用等)。 你知道一个优雅的解决方案吗? 我正在考虑传递一个令牌/请求 ID(对于由 Web 服务器请求启动的流)——但这需要传递它——并且也不包括您可以在堆栈跟踪中看到的任何状态。 也许传递一个堆栈? :)
【问题讨论】:
-
您可以通过将令牌放入
DynamicVariable来避免传递令牌。你可以有类似case class Context(requestId: Int, /* other things you need to pass around */); object Context { val context = new DynamicVariable(Context(0 /* must be some default value or e.g. null at this point */, ...)) } -
@Kolmar:好主意——为什么不把它作为答案呢? PS - 任何建议如何隐式传递?
-
好吧,我已经回答了关于隐式传递 requestId 的问题,但我真的不知道传递堆栈跟踪有多大用处。
-
谢谢!非常详细的答案。传递堆栈跟踪可能是一种矫枉过正,但我认为至少有一些允许对整个事件流的日志进行 grepping 的令牌是必须的......如果它是事务明确需要的(用户 ID 等) -伟大的。如果您没有,我认为添加它是有益的。
标签: scala debugging promise future