помогите мне в Stateful бобах - PullRequest
       22

помогите мне в Stateful бобах

1 голос
/ 24 декабря 2009

Вопрос 1: Согласно книге, которой я следую, чтобы узнать, EJB-автор сказал, что каждый поиск создает новый сессионный компонент с состоянием. Итак, я определил метод init () с аннотацией @PostConstruct с помощью оператора sysout. Таким образом, это должно быть выполнено для каждого экземпляра Stateful bean. Но то же самое не происходит. Рассмотрим следующий код

в бобах

@Stateful
public class PersonnelModelBean implements PersonnelModelRemote{

    @PostConstruct
    void init(){
        System.out.println("STATEFUL BEAN transforming to Mathod Ready state");
    }

}

На стороне клиента

try {
            InitialContext context = InitialContextBuilder.getJBOSSInitialContext();
            PersonnelModelRemote personnelModel = (PersonnelModelRemote)context.lookup("PersonnelModel/remote");
            personnelModel.setPersonKey(new Integer(1));
            personnelModel.setPersonName("Naresh");
            PersonData person = personnelModel.getPerson();
            System.out.println(person);
            personnelModel = (PersonnelModelRemote)context.lookup("PersonnelModel/remote");
            personnelModel.setPersonKey(new Integer(2));
            personnelModel.setPersonName("Pokuri");
            person = personnelModel.getPerson();
            System.out.println(person);
        } catch (NamingException e) {
            e.printStackTrace();
        }

Вопрос 2: Точно так же автор сказал, что при вызове аннотированного метода @Remove удалит связанный с клиентом компонент из контейнера. Таким образом, контейнер должен вызывать метод destroy () (который аннотирован @PreDestroy) при удалении компонента. Но этого не происходит. Рассмотрим следующий код

@Stateful
public class PersonnelModelBean implements PersonnelModelRemote{

@Remove
    public PersonData getPerson() {
        PersonData personData = new PersonData();
        personData.setKey(key);
        personData.setName(name);
        return personData;
    }

    @PreDestroy
    void destroy(){
        System.out.println("STATEFUL BEAN transforming to Does not exist state");
    }
}

Вопрос 3: Я установил значение 60 секунд в файле standardjboss.xml каталога server / default / conf JBOSS. Я ждал 15 минут, и при выполнении клиентского кода он должен вызывать аннотированный метод @PostConstruct, как сказано в книге. Но этого также не происходило.

1 Ответ

1 голос
/ 01 января 2010

Q1: это должно работать, метод с аннотацией PostConstruct должен быть вызван до того, как любые другие вызовы достигнут SFSB. Работает ли ваш клиент? Возможно сообщение журнала идет к server.log

Q2: метод с аннотацией удаления вызывается перед тем, как контейнер удаляет компонент из пула контейнеров. Он не предназначен для использования с бизнес-методами. Чек http://www.java2s.com/Code/Java/EJB3/RemoveAnnotation.htm

Q3: очистка может быть отложена в зависимости от ваших настроек в $ JBOSS_HOME / server / defalut / conf / standardjboss.xml Проверьте параметры политики кэширования в этом разделе:

<container-configuration>
      <container-name>Standard Stateful SessionBean</container-name>
      <call-logging>false</call-logging>
... 

Может быть, вы можете заставить контейнер уничтожать ненужные бины (только для тестирования), установив

<container-pool-conf>
        <MaximumSize>1</MaximumSize>
</container-pool-conf>

и использовать второй клиент.

...