2013-04-15 1 views
0

JBoss AS 7의 EJB에 대한 코스를 작성 중이며 몇 가지 문제가 있습니다. 호출 된 상태 비 저장 EJB는 절대로 변경되지 않습니다.

@Stateless 
public class CitationEJB { 

    String citation ="Hello Citation"; 

    public String getCitation(){ 
     System.out.println("getting citation from :"+this.toString()); 
     return this.citation; 
    } 

    public void setCitation(String citation) { 
     System.out.println("changing citation to : "+citation); 
     this.citation = citation; 
    } 

    @PostConstruct 
    public void sayHello(){ 
     System.out.println("Hello, I'm a new EJB"); 
    } 
} 

그럼 내가 JSF ManagedBean은에서 JNDI를 통해 EJB를 호출 :

@ManagedBean 
@SessionScoped 
public class CitationBean { 

    //@EJB trying this time with JNDI 
    CitationEJB ejb; 

    public String getCitation() throws NamingException{ 
     ejb = lookupCitationEJB(); 
     return ejb.getCitation(); 
    } 

    public String getCitation2() throws NamingException{ 
     ejb.setCitation("hello Toto"); 
     CitationEJB ejb = lookupCitationEJB(); 
     return ejb.getCitation(); 
    } 

    private static CitationEJB lookupCitationEJB() throws NamingException { 
     Hashtable jndiProperties = new Hashtable(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     Context context = new InitialContext(jndiProperties); 
     String jndiName = "java:global/CitationsDyn/CitationEJB!com.citations.ejb.CitationEJB"; 
     //jndiName = "java:app/CitationsDyn/CitationEJB"; // Works also 
     return (CitationEJB) context.lookup(jndiName); 
    } 
} 

가 그럼 난 JSF와 CitationEJB.getCitation()를 표시 나는 단순한 지역 무 EJB가 있습니다. F5를 만들 때 새로운 요청을 할 때를 제외하고는 항상 동일한 객체가 있습니다. CitationEJB.setCitation ("Hello toto"), F5를 사용하면 "Hello Toto"및 브랜드가 없습니다. 새로운 Object.

@EJB 주석을 사용하여 EJB를 가져올 때 모든 요청에 ​​대해 새로운 객체가 예상되는 동작을 보입니다.

그래서 내가 배운 것은 EJB가 풀에서 선택된다는 것이지만 언제 파괴되는 것입니까? JNDI 조회는 JSF 페이지와 마찬가지로 Scope에 바인딩되지 않는다고 생각합니다. 그러나 정확히 어떻게 지정되어 있습니까?

+0

http://stackoverflow.com/questions/14200552/stateless-ejb3-bean-invoked-from-request-scoped-jax-rs-web-service-accumulates-s/14201781#14201781 귀하의 질문은 표현 된 것 같습니다. 다르게,하지만 대답은 내가 믿는다. –

답변

1

Stateless Session Bean의 수명주기는 컨테이너에 의해 관리됩니다. EJB가 배치되면 여러 인스턴스가 생성되어 인스턴스 풀에 배치됩니다 (예 : JBoss 6은 기본적으로 10 개의 인스턴스를 생성합니다). 수요에 따라 숫자를 확대 또는 축소 할 수 있습니다. EJB는 일반적으로 사용 후 폐기되지 않고 다시 사용하기 위해 다시 풀에 저장됩니다.

상태를 유지하려는 응용 프로그램의 경우 Stateful Session Bean이 적절하게 선택됩니다 (또는 인스턴스간에 상태를 공유하려는 경우 단일 세션 Bean). Stateful Session Bean을 사용하면 @Remove를 사용하여 메소드에 주석을 추가하여 EJB를 소멸시킬 수 있습니다.