У меня есть следующая конфигурация:
- 1 EAR на одном GF, содержащем 2 EJB-JAR с компонентами EJB.
- 1 WAR на другом сервере Glassfish ( => другая JVM ), содержащем веб-компоненты, обращающиеся к компонентам EJB.
У меня есть 2 бизнес-службы EJB в каждом EJB-JAR моего EAR, и все они разрабатываются следующим образом:
@Remote
public interface ServiceAItf {
...
}
@Stateless
@Local
public class ServiceAImpl implements ServiceAItf {
...
}
В моей WAR я обращаюсь к компонентам EJB через явный "InitialContext.lookup" на удаленном интерфейсе.
В моем EAR я не совсем понимаю, как лучше внедрять инъекцию с точки зрения производительности, архитектуры и т. Д. *
У меня есть следующие вопросы:
Как вы можете видеть, я объявил аннотацию "@ Local" для реализации службы без определения локального интерфейса. Это правильно? По крайней мере, у меня нет ошибки при развертывании. Но, возможно, мне лучше использовать аннотацию "@ LocalBean" ? Я предполагаю, что аннотация "@ LocalBean" просто позволяет напрямую вызывать реализацию как "Local" EJB, но вы должны использовать реализацию в своем коде так:
@ Stateless
@Местный
открытый класс ServiceBImpl реализует ServiceBItf {
@EJB
частный сервис AImpl serviceA;
...
}
Как лучше всего внедрить один EJB в другой?
Это работает так:
@ Stateless
@Местный
открытый класс ServiceBImpl реализует ServiceBItf {
@EJB
частный сервис AItf serviceA;
...
}
Но из того, что я заметил, «serviceA» - это удаленный прокси-сервер, находящийся в той же JVM в том же файле EAR. Поэтому я предполагаю, что это повлияет на производительность. Вот почему я попытался внедрить услугу так:
@Stateless
@Local
public class ServiceBImpl implements ServiceBItf {
@Inject
private ServiceAItf serviceA;
...
}
Но в GF это не работает, у меня есть следующее исключение:
WELD-001408 Unsatisfied dependencies for type [...] ...
Затем я попытался создать локальный интерфейс, и внедрение через аннотацию "@Inject" работает, когда обе службы
Даже если я создаю подобный локальный интерфейс, сервис не внедряется через аннотацию "@ Inject" , но имеет значение null:
@Local
public interface ServiceALocalItf {
...
}
Я прочитал много статей, в которых настоятельно рекомендуется использовать "@ Inject" вместо "@ EJB" , когда это для локального вызова. Это приводит меня к следующему вопросу: в каком случае рекомендуется (или просто используется) вызов "@ Local" EJB?
После всего этого анализа я прихожу к следующему выводу:
- Для каждой службы я создаю "@ Local" и "@ Remote" интерфейс.
- От WAR до EJB-JAR EAR выполните поиск JNDI для удаленного интерфейса.
- Из EJB-JAR в EJB-JAR выполнить инъекцию через "@ EJB" в локальный интерфейс.
- Для двух служб в одном и том же EJB-JAR сделайте инъекцию через "@Inject" в локальный интерфейс.
Что вы думаете об этом? Это правильно?