2012-07-23 2 views
0

내가 아는 한 FacesContext는 요청 범위에서만 사용할 수 있습니다. FacesContext의 인스턴스를받는 스레드를 만들었지 만 null을 반환합니다.JSF가 요청 외부 FacesContext를 수신합니다.

요점은 응용 프로그램 범위 콩을 10 초마다 업데이트하는 것입니다.

스레드의 실행 방법 :

@Override 
public void run() 
{ 
    while (true) 
    { 
     try 
     { 
      TimeView timeView = (TimeView)FacesContext.getCurrentInstance(). 
        getExternalContext().getApplicationMap().get("timeView"); 
      // FacesContext.getCurrentInstalce() returns null 

      timeView.update(); 
      Thread.sleep(10000); 
     } 
     catch (InterruptedException ex) 
     { 
      System.out.println(ex); 
     } 
    } 
} 
(나는 건너 뛴의 getter/setter를 한)

TimeView에서의 헤더 :

@ManagedBean(eager=true, name="timeView") 
@ApplicationScoped 
public class TimeView implements Serializable 
{ 
    private int hour; 
    private int minutes; 
    private int seconds; 

    public TimeView() 
    { 
     update(); 
    } 

    public void update() 
    { 
     Date date = new Date(); 
     setHour(date.getHours()); 
     setMinutes(date.getMinutes()); 
     setSeconds(date.getSeconds()); 
    } 

얼굴-config.xml에 : 그래서

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 

    <managed-bean> 
     <managed-bean-name>timeView</managed-bean-name> 
     <managed-bean-class>foogame.viewBeans.TimeView</managed-bean-class> 
     <managed-bean-scope>application</managed-bean-scope> 
    </managed-bean> 
</faces-config> 

가있다 이 스레드에서 응용 프로그램 범위의 bean에 대한 refference를받는 방법이 있습니까?

+0

ejbs를 사용하고 있습니까? –

+0

나는 그것이 무엇인지 전혀 모른다. –

답변

1

서블릿 환경 외부에서 FacesContext에 액세스/구성하는 방법이 있으므로 애플리케이션 범위 객체를 작업자 스레드 (배치 작업을 수행하는 스레드)의 생성자에 전달하는 것이 좋습니다. 스레드에서 참조를 업데이트하면 둘 다 동일한 인스턴스를 가리 키기 때문에 응용 프로그램 범위 참조가 업데이트됩니다.

EJB3 환경이있는 경우 스레드 및 범위를 처리 할 필요없이 EJB timer + @Singleton bean을 사용할 수 있습니다.

관련 문제