Несколько экземпляров EJB 3.1 без интерфейса Singleton / Stateful сессионный компонент - PullRequest
0 голосов
/ 07 марта 2012

Я хочу получить доступ к нескольким экземплярам singletonA и singletonB синглтона без интерфейса MySingleton.Сначала экземпляры определяются в другом классе Singleton Configurator:

MySingleton.java

@Singleton
@LocalBean
public class MySingleton {
    ...
}

Configurator.java

@Singleton
@Startup
@LocalBean
public class Configurator {
    @EJB MySingleton singletonA;
    @EJB MySingleton singletonB;
}

Код выше, по-видимому, работает.

Теперь мне нужно внедрить эти 2 экземпляра MySingleton в компонент, управляемый сообщениями:

MDB.class

@Stateless
public class MDB implements MessageListener {
    @EJB (lookup="?")      MySingleton singletonA;
    @EJB (mappedName="??") MySingleton singletonB;
}

Но в этот момент я полностью потерян.Я знаю, что мог бы упростить ситуацию, определив 2 экземпляра как 2 (пустые) реализации уникального интерфейса.Но у меня есть некоторые проблемы, потому что класс содержит некоторые нестатические поля, поэтому я не могу определить его как интерфейс.

EDIT

Из-за природы MDBЯ не могу передать Singletons по ссылке.Наконец, я хотел бы избежать создания двух идентичных реализаций MySingleton.

Благодаря полученным ответам я переосмыслил всю архитектуру и должен согласиться с тем фактом, что определение MySingleton как Stateful было бы хорошо, так какхорошо.

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Полагаю, вы понимаете, что это противоречие.У @Singleton есть только один экземпляр, поэтому у вас не может быть двух.Вероятно, вам нужен другой вид бобов (например, @Stateful ejb)

1 голос
/ 07 марта 2012

Прежде всего, в Конфигураторе MySingleton singletonA и MySingleton singletonB одинаковы. Это потому, что весь смысл @Singleton состоит в том, чтобы иметь только один экземпляр, независимо от того, сколько раз и где он введен (в той же JVM). Контейнер создает экземпляр до того, как вы добавите его в первый раз, и после того, как тот же экземпляр будет опубликован. Таким образом, вы также можете пойти и ввести (скорее всего, один раз) его снова в AnotherEJB .

Даже если мы предполагаем регистр без Singleton (например, Staless), использование @EJB для инъекции не приводит к появлению новых записей, доступных для инъекции в другое место. Так что, если вы вводите что-то через @EJB в классе A, вы не можете через инъекцию передать ссылку на класс B. Для передачи ссылки вызов метода является хорошим способом.

...