有誰知道Http.Context.current()是如何實現的?這是一種靜態方法,我在非靜態方法中,在非控制器方法中,在非單線程應用程序中使用,並且它工作得很好。我在問自己......怎麼?播放Http.Context實現
我真的很好奇它是如何在內部工作的,因爲Play沒有單線程每請求模式,而且他們是如何做到這一點的。
有誰知道Http.Context.current()是如何實現的?這是一種靜態方法,我在非靜態方法中,在非控制器方法中,在非單線程應用程序中使用,並且它工作得很好。我在問自己......怎麼?播放Http.Context實現
我真的很好奇它是如何在內部工作的,因爲Play沒有單線程每請求模式,而且他們是如何做到這一點的。
如果你看看實現,你可以看到,目前被保存爲一個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
如果你將開始使用自己的線程池和做的東西,雖然你可能會泄漏線程之間的上下文並導致各種奇怪的問題。
可能有趣的是要注意,在Scala方面我們不這樣做,但總是將上下文作爲參數傳遞到每個地方(通常藉助稱爲implicits的Scala特性) – johanandren 2014-09-03 19:06:12