multithreading - 无法从自生成线程访问 FacesContext.getCurrentInstance()

标签 multithreading jsf-2 primefaces

无法在自生成的线程中获得“FacesContext.getCurrentInstance()”。

需要根据后端流程动态更新组件。通过创建一个线程来监视进程并与 p:poll 一起回调组件更新来实现相同的目的。

但是,似乎“FacesContext.getCurrentInstance()”不适用于新线程。在从新生成的线程调用任何依赖于 FacesContext.getCurrentInstance() 的实用程序方法时获取 NPE。

有没有办法让“FacesContext.getCurrentInstance()”在自生成的线程中可用?

环境 JSF2.0、Prettyfaces-jsf2-3.3.2、Primafaces 3.2、Tomcat 6.0.32、JDK 5.0

谢谢你,

最佳答案

FacesContext 就像是 ThreadLocal<T> 存储在执行当前 HTTP servlet 请求的线程中。你绝对不能在你自己产生的其他线程中访问它,这会破坏 JSF/Servlet 的整个工作。相反,您应该从 FacesContext 准确传递您需要的信息。在其构造函数的可运行对象中,可能只是具体的 bean 实例本身,或者一些其他对象,这些对象反过来也被引用为 session 属性。

顺便说一下,在 Java EE Web 应用程序中生成非托管线程是一种味道。确保你真的了解你在做什么。另见 Is it safe to start a new thread in a JSF managed bean?

关于multithreading - 无法从自生成线程访问 FacesContext.getCurrentInstance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266427/

相关文章:

java - 多线程通信: how good is the use of Atomic Variables like AtomicInteger? 为什么没有AtomicFloat?

ios - 同步排队比异步排队时代码运行得更快。不应该相反吗?

java - 有没有类似<c :url> for JSF?

java - 如何在jsf 2中使用参数 "javax.faces.FACELETS_SUFFIX"

java - 似乎无法弄清楚如何使用 primefaces 重定向到 .xhtml

java - Primefaces:使用 ajax 将就地标记保存到数据库

c++ - 如何防止对正在被销毁的子类实例进行调用函数调用

c++ - 为什么 boost::thread 可以被删除两次?

spring - 如何使用 WebApplicationInitializer 配置素面 FileUploadFilter

java - PrimeFaces:如何设置 p:subtable 列的宽度