Можно ли искать удаленный сеанс EJB в init () сервлета? - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть несколько сервлетов, которые вызывают удаленный сеанс EJB для управления запросами пользователя. В первый раз я создал новый менеджер для каждого метода следующим образом:

ManagerAdminRemote managerAdmin;
Context jndiContext = new javax.naming.InitialContext();
Object ref = jndiContext.lookup("ManagerAdmin/remote");
managerAdmin = (ManagerAdminRemote) PortableRemoteObject.narrow(ref, ManagerAdminRemote.class);

Чтобы избежать этого повторения, я реализовал метод init следующим образом:

public void init(ServletConfig config) throws ServletException {
    super.init(config);
    try {
        Context jndiContext = new javax.naming.InitialContext();
        Object ref = jndiContext.lookup("ManagerAdmin/remote");
        managerAdmin = (ManagerAdminRemote) PortableRemoteObject.narrow(ref, ManagerAdminRemote.class);
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

С managerAdmin, объявленным как атрибут класса.
Сессионный компонент ManagerAdmin не имеет состояния.

Я использую JBoss 5, и я увидел, что init() вызывается при первом вызове сервлета. Но я также заметил, что все пользователи используют одни и те же объекты, объявленные как атрибут класса. Так, например, разные пользователи будут использовать один и тот же managerAdmin.

Пока я не столкнулся с какой-либо проблемой, но я спрашиваю: может ли это совместное использование привести к каким-либо проблемам? Задержки? Или, поскольку менеджеры не имеют гражданства, это нормально?

Заранее спасибо.

1 Ответ

1 голос
/ 28 декабря 2011

Вы можете использовать службы без сохранения состояния, если ссылки на эти службы являются переменными экземпляра. В качестве альтернативы вы можете создать метод getManagerAdmin(), который будет выполнять поиск для вас, и, таким образом, вам не придется повторять код поиска в каждом методе.

Если вы можете использовать Java EE 6 и, следовательно, EJB 3.1, вы можете разрешить контейнеру внедрять сервисы в сервлет. Обратите внимание, что это работает только для локальных поисков в одном и том же контексте загрузки класса (обычно это одно и то же приложение, но это может быть та же JVM, если приложения не изолированы веб-сервером / сервером приложений).

...