0

我已使用讨论中描述的解决方案将 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"));
}
4

1 回答 1

0

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

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

寻找轮询/推送技术。这个具体问题与类层次结构/范围完全无关。将来,如果您确定了null. 你似乎根本没有这样做。

于 2013-03-13T12:22:40.760 回答