EJB без гражданства - инициализация частных членов - PullRequest
2 голосов
/ 21 октября 2011

Я новичок в 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);
     }
 }

Проблема в том, что моя переменная "message" всегда равна нулю при печати в методе printMsg () ... Какой лучший способ добиться этого?

Спасибо за вашу помощь!

1 Ответ

10 голосов
/ 21 октября 2011

Вы смешиваете несколько вещей здесь.

  1. Аннотация @ PostActivate должна использоваться на компонентных сессионных компонентах (SFSB), а вы - на синглтоне. Я предполагаю, что вы имеете в виду метод @ PostConstruct , который применяется к каждому компоненту, жизненный цикл которого управляется контейнером.

  2. Вы используете конструктор из вашего EJB. Вы не можете сделать :

    ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
    

    , поскольку он создает только экземпляр этого класса. Это не EJB - контейнер не создал его, поэтому этот класс еще не имеет EJB-природы. В этом весь смысл внедрения зависимости - вы просто определяете, что вы хотите, и контейнер отвечает за предоставление вам соответствующего экземпляра ресурса.

  3. Компонент без состояния (SLSB) не предназначен для удержания состояния. SFSB есть. Даже если вы установите сообщение в одном методе SLSB (то есть в каком-либо методе ScheduleEJB # setMessage (String)), вам нужно помнить, что EJB объединяются в . У вас нет никаких гарантий, что при следующем вызове метода в ScheduleEJB вы попадете в тот же экземпляр.

В вашем случае было бы простым решением просто добавить метод @Schedule в ваш синглтон-класс. Чем вы можете определить переменную по вашему выбору в методе @PostConstruct. Вы можете быть уверены, что в JVM имеется только один экземпляр Singleton, поэтому ваша переменная будет видна в аннотированном методе Schedule того же класса.

НТН.

...