加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

jsf – FacesContext.getCurrentInstance()在Runnable类中返回nu

发布时间:2020-12-14 16:33:52 所属栏目:Java 来源:网络整理
导读:我试图通过在Runnable类的run()方法中调用FacesContext.getCurrentInstance()来获取FacesContext,但它返回null. public class Task implements Runnable { @Override public void run() { FacesContext context = FacesContext.getCurrentInstance(); // nul
我试图通过在Runnable类的run()方法中调用FacesContext.getCurrentInstance()来获取FacesContext,但它返回null.
public class Task implements Runnable {

    @Override
    public void run() {
        FacesContext context = FacesContext.getCurrentInstance(); // null!
        // ...
    }

}

这是怎么造成的,我该如何解决?

解决方法

FacesContext作为 ThreadLocal变量存储在负责调用FacesServlet的HTTP请求的线程中,FacesServlet负责创建FacesContext.该线程通常仅通过JSF托管bean方法. FacesContext在该线程生成的其他线程中不可用.

实际上你应该也不需要在其他线程中使用它.此外,当您的线程启动并独立运行时,底层HTTP请求将立即继续处理HTTP响应然后消失.无论如何,您将无法使用HTTP响应执行某些操作.

您需要以不同方式解决您的问题.问问自己:你需要什么?获取一些信息?只需在构建过程中将该信息传递给Runnable即可.

以下示例假定您要访问线程中的某个会话作用域对象.

public class Task implements Runnable {

    private Work work;

    public Task(Work work) {
        this.work = work;
    }

    @Override
    public void run() {
        // Just use work.
    }

}
Work work = (Work) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("work");
Task task = new Task(work);
// ...

但是,如果您最终需要通知客户,例如线程的工作已经完成,那么你应该寻找一个不同于添加面部消息左右.答案是使用“推”.这可以通过SSE或websockets实现.在这个相关问题中可以找到具体的websockets示例:Real time updates from database using JSF/Java EE.如果您碰巧使用PrimeFaces,请查看
<p:push>.如果您碰巧使用OmniFaces,请查看<o:socket>.

与具体问题无关,手动创建Runnables并在Java EE Web应用程序中手动生成线程令人震惊.前往以下Q& A,了解所有警告以及如何实际完成:

> Spawning threads in a JSF managed bean for scheduled tasks using a timer
> Is it safe to start a new thread in a JSF managed bean?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读