2013-03-12 65 views
0

我已经使用this讨论中描述的解决方案来实现BackgroundJobManager作为我的JSF bean类内部的类。我还创建了一个ABCTask(也是一个内部类)作为将在BackgroundJobManager的预定时间运行的线程。我有一个要求将消息推送到JSF页面,但是从任务类ABCTask这样做会导致NPE。同样的事情对外部bean有效,所以我确信这与这个内部类和bean的上下文有关。如果有人知道这个解决方案,将不胜感激。显示来自管理bean的内部类的消息

我的内部类的代码如下:

public class ABCTask implements Runnable { 

    public ABCTask() { 

    } 

    @Override 
    public void run() {   
     setTimeoutOccuredFlag(true); 

     try { 
       if (getActiveControlledAgent().isEventLogRunning()) { 
        getActiveControlledAgent().setEventLogRunning(false); 
       } 
       printTimeoutMessage(); 
     logger_o.fine("Now leaving the ABCTask ..."); 
     } catch (Exception e) { 
      logger_o.error("An error while idling "+e.getMessage()); 
     } 
    } 

} 

的$ printTimeoutMessage()如下:

void printTimeoutMessage() { 
    FacesUtils.addErrorMessage(MESSAGES.getString("common.timeoutOccured")); 
} 
+0

封装bean的范围是什么,你如何试图访问内部类和堆栈跟踪在哪里? – kolossus 2013-03-12 18:01:54

回答

0

你基本上手动产生线程。 FacesContext仅在提供HTTP请求的线程中可用,该请求与FacesServlet的URL模式相匹配,而不在其他线程中。 FacesContext#getCurrentInstance()将在所有其他线程中返回null

再次想一想,如果没有客户端发送HTTP请求,您会如何向HTTP响应发送消息?默认情况下,您不能在没有请求的情况下向客户端发送任何内容。

寻找投票/推送技巧。这个具体问题与类层次/范围完全无关。在未来,如果您确定了什么是null,那么您和我们会更有帮助。你似乎根本没有这样做。

相关问题