помогите мне в Stateful beans

Вопрос 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, как сказано в книге. Но этого тоже не происходило.


person Pokuri    schedule 24.12.2009    source источник


Ответы (1)


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>

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

person stacker    schedule 01.01.2010
comment
Q1: Все журналы отображаются на консоли eclipse. Q2: Но контейнер Stateful bean-компонентов не будет использовать концепцию пула. - person Pokuri; 09.01.2010
comment
Q1: возможно, вы добавите еще один System.out в метод, который вызывается, чтобы убедиться, что другое сообщение отображается в консоли eclipses. Q2: В jboss-4.2.3 я нашел конфигурацию размера пула для сеансовых компонентов с отслеживанием состояния в файле standardjboss.xml, поэтому я бы не стал предполагать, что это поддельные записи. - person stacker; 09.01.2010