我已经使用this讨论中描述的解决方案将BackgroundJobManager实现为我的JSF bean类中的内部类。我还创建了一个ABCTask(也是一个内部类)作为一个线程,它将在BackgroundJobManager的预定时间运行。我需要将消息推送到JSF页面,但是从任务类ABCTask执行此操作会导致NPE。同样的事情适用于外部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 :(得分:0)
你基本上是手动产生一个线程。 FacesContext
仅在提供HTTP请求的线程中可用,该线程与FacesServlet
的URL模式匹配,而不是在其他线程中。 FacesContext#getCurrentInstance()
将在所有其他线程中返回null
。
再想一想,如果客户端没有发送HTTP请求,您将如何向HTTP响应发送消息?默认情况下,如果没有请求,则无法向客户端发送任何内容。
寻找民意调查/推送技巧。这个具体问题与类层次结构/范围完全无关。将来,如果您确定了null
到底是什么,它对您和我们会更有帮助。你好像根本没有这样做过。