2013-03-12 4 views
0

this 토론에 설명 된 솔루션을 사용하여 BackgroundJobManager를 내 JSF bean 클래스의 내부 클래스로 구현했습니다. 또한 ABCTask (내부 클래스)를 BackgroundJobManager의 예약 된 시간에 실행되는 스레드로 만들었습니다. JSF 페이지에 메시지를 푸시해야한다는 요구 사항이 있지만 ABCTask 태스크 클래스에서 그렇게하면 NPE가 생성됩니다. 바깥 쪽 빈에 대해서도 똑같은 일이 일어납니다. 그래서이 클래스는이 내부 클래스와 빈의 컨텍스트와 관련이 있다고 확신합니다. 누군가가 이것을위한 해결책을 안다면 고맙겠습니다.관리 대상 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

엔 클로징 빈의 범위는 무엇입니까? 내부 클래스에 액세스하는 방법과 스택 추적은 어디에 있습니까? – kolossus

답변

0

. FacesContext은 다른 스레드가 아닌 FacesServlet의 URL 패턴과 일치하는 HTTP 요청을 처리하는 스레드에서만 사용할 수 있습니다. FacesContext#getCurrentInstance()은 다른 모든 스레드에서 null을 반환합니다.

다시 한번 생각해보십시오. 클라이언트가 HTTP 요청을 보내지 않고 HTTP 응답에 어떻게 메시지를 보내겠습니까? 기본적으로 요청하지 않은 경우 클라이언트에 보낼 수 없습니다.

폴링/푸시 기술을 찾으십시오. 이 구체적인 문제는 클래스 계층/범위와 완전히 관련이 없습니다. 앞으로 null이 무엇인지 정확히 파악했다면 더 많은 도움이 될 것입니다. 당신은 전혀하지 않았던 것 같습니다.

관련 문제