2014-09-03 36 views
0

有谁知道Http.Context.current()是如何实现的?这是一种静态方法,我在非静态方法中,在非控制器方法中,在非单线程应用程序中使用,并且它工作得很好。我在问自己......怎么?播放Http.Context实现

我真的很好奇它是如何在内部工作的,因为Play没有单线程每请求模式,而且他们是如何做到这一点的。

回答

1

如果你看看实现,你可以看到,目前被保存为一个ThreadLocal值,所以它被存储在当前线程: https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/java/play/mvc/Http.java

但怎么能那么它可以运行期货访问其他线程?有一个叫HttpExecutionContext使用特殊的执行上下文将捕获的背景下​​,这样它是可用的,你可以在这里看到: https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/java/play/libs/HttpExecution.java

如果你将开始使用自己的线程池和做的东西,虽然你可能会泄漏线程之间的上下文并导致各种奇怪的问题。

+0

可能有趣的是要注意,在Scala方面我们不这样做,但总是将上下文作为参数传递到每个地方(通常借助称为implicits的Scala特性) – johanandren 2014-09-03 19:06:12