有谁知道如何实现Http.Context.current()?这是一个静态方法,我在非静态方法中使用,在非控制器方法中,在非单线程应用程序中使用,并且它工作得很好。我问自己......怎么样?
我很好奇它是如何在内部工作的,因为Play没有每个请求的一个线程模型,并且他们是如何做到这一点很有趣。
答案 0 :(得分:1)
如果查看实现,可以看到当前值保存为ThreadLocal值,因此它存储在当前线程中: https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/java/play/mvc/Http.java
但是如何在Futures中访问它可能在其他线程上运行呢?有一个名为HttpExecutionContext的特殊执行上下文,它将捕获上下文以便它可用,你可以在这里看到它: https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/java/play/libs/HttpExecution.java
如果您开始使用自己的线程池并对其进行操作,尽管您可能会泄漏线程之间的上下文并导致各种奇怪的问题。