2011-10-21 6 views
2

저는 EJB를 처음 접했고 첫 번째 문제에 직면 해 있습니다. Stateless EJB에 포함 된 @Schedule 메서드를 사용하려고합니다.EJB 상태 비 저장 - 비공개 멤버 초기화

여기에 간단한 예제입니다 :

@Singleton 
@LocalBean 
@Startup 
public class Starter { 

    @PostActivate 
    private void postActivate() { 

     ScheduleEJB scheduleEjb = new ScheduleEJB("Hello"); 

    } 

} 

그리고 일정 콩 :

@Stateless 
@LocalBean 
public class ScheduleEJB { 

    private String message; 

    public ScheduleEJB() { 
     super(); 
    } 

    public ScheduleEJB(String message) { 
     super(); 
     this.message= message; 
    } 

    @Schedule(second="*/3", minute="*", hour="*", dayOfMonth="*", dayOfWeek="*", month="*", year="*") 
    private void printMsg() { 

     System.out.println("MESSAGE : " + message); 
    } 
} 

문제 나는 콩 작성시 설정됩니다 개인 멤버 변수를 사용하려면이 방법을 싶습니다 printMsg() 메서드에서 인쇄 할 때 내 "메시지"변수가 항상 null이라는 것입니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

도움 주셔서 감사합니다.

+0

두 클래스 대신 단일 싱글 톤 EJB를 사용하지 않는 이유를 설명 할 수 있습니까? PostConstruct 메소드로 변수를 초기화하고 동일한 싱글 톤 클래스에서 스케줄러를 정의 할 수 있습니다. – perissf

답변

10

여기 몇 가지를 혼합하고 있습니다.

  1. @PostActivate 주석 상태 세션빈 (SFSB)에 사용되는, 당신은 싱글에 그것을 사용할 수 있습니다. 컨테이너로 라이프 사이클을 관리하는 모든 빈에 적용되는 @PostConstruct 메소드를 의미하는 것 같습니다.

  2. EJB의 생성자를 사용하고 있습니다. 당신은을 수행 할 수 없습니다

    ScheduleEJB scheduleEjb = new ScheduleEJB("Hello"); 
    

    는이 클래스의 바로 인스턴스를 생성한다. 그것은 EJB가 아닙니다. 컨테이너가 컨테이너를 생성하지 않았으므로,이 클래스는 아직 EJB 속성을 가지고 있지 않습니다. 그게 바로 의존성 삽입의 요점입니다. 원하는 것을 정의하면 컨테이너가 리소스의 적절한 인스턴스를 제공 할 책임이 있습니다.

  3. 스테이트리스 빈 (Stateless Bean, SLSB)은 상태를 보유하기위한 의도가 없습니다. SFSB는입니다. 하나의 SLSB 메소드 (예 : 일부 ScheduleEJB # setMessage (String) 메소드)에서 메시지를 설정하더라도 EJB가 풀링되어 있다는 것을 기억해야합니다 (). 다음에 ScheduleEJB에서 동일한 인스턴스를 가져올 메서드를 호출 할 때 어떤 보증도하지 않습니다.

귀하의 경우에는 싱글 톤 클래스에 @Schedule 메서드를 추가하는 것이 좋습니다. @PostConstruct 메소드에서 선택한 변수를 정의 할 수 있습니다. JVM 당 단 하나의 Singleton 인스턴스가 있다는 것을 확신 할 수 있으므로 변수는 같은 클래스의 Schedule 주석 메소드에 표시됩니다.

HTH.

+1

@ user1006840 문제를 해결 했습니까? –

+1

좋은 답변 @PiotrNowicki .. – Kurohige

관련 문제