Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ejb. Показать все сообщения
Показаны сообщения с ярлыком ejb. Показать все сообщения

воскресенье, 8 декабря 2019 г.

Ejb совместно c Spring

#java #spring #java_ee #ejb


Как в spinge использовать EJB классы.

Да EJB не очень, тем более в библиотеке использовать спринг или ejb - это жесть,
но что досталось то приходится пока использовать.
Есть вопросы


Как спринг дружит с EJB с аннотациями типа stateless, ejb, и даже ConcurrencyManagement.
Если сервер приложений поднимает эти бины при запуске, как спринг делает их своими
бинами и делает ли своими бинами или какая то прокся между бинами управляемые сервером
приложений и бинами спринга
Как отключить поднятие EJB бинов сервером приложений и чтобы такие бины управлялись
спрингом путем сканирования этих пакетов либо же просто через конфигурацию

    


Ответы

Ответ 1



Если коротко, только получать их от сервера приложений через JNDI. Контейнер Spring и контейнер EJB/CDI - это два разных, хоть и похожих, мира. У бинов Spring и EJB разный жизненный цикл, а у контейнеров разные механизмы обеспечения этого жизненного цикла. Отсюда ответы на ваши вопросы: Никак не дружит. Эти аннотации анализирует и действует в соответствии с ними CDI-контейнер. Когда Spring встречает поле, в которое нужно внедрить зависимость, он ищет эту зависимость в контексте. А появиться зависимость в контексте может разными способами - в результате вызова конструктора объявленного в конфигурации бина, в результате вызова фабричного метода какого-нибудь класса, в результате JNDI-запроса. Как раз последним способом контекст Spring и получает EJB от сервера приложений. Никак. Spring не сможет самостоятельно управлять EJB. Так что вам придётся запустить ваше Spring-приложение, включающее EJB-компоненты, на сервере приложений, добавить в конфигурацию контекста что-нибудь вроде и убедиться в наличии соответствующего сеттера в бине Spring public class SomeSpringBean { private SomeEJB someEjb; public void setSomeEjb(SomeEJB someEjb) { this.someEjb = someEjb; } } Почитать можно здесь.

понедельник, 17 июня 2019 г.

Наблюдение за транзакциями

Имеется Java EE приложение (на сервере WildFly), работа с базой идёт через предоставляемый сервером DataSource. Каким образом можно произвести наблюдения, за происходящими транзакциями в ходе выполнения запроса к EJB компоненту? То есть, произвести дебаг транзакций, грубо говоря.


Ответ

Для наблюдения за транзакциями в WildFly можно использовать, например, Narayana Transaction Analyser (NTA) (http://narayana.io/downloads/index.html). Несмотря на некоторую "древность" последней версии (апрель 2014 года) и альфа-статус, продукт вполне работоспособен и выдаваемая им информация является достаточно полезной.

Использование EJB и EJB Lite в Wildfly

Каким образом определяется, какой тип EJB-компонентов будет использоваться в приложении? Wildfly поддерживает и веб и полный профиль JEE 7, а значит реализует и EJB, и EJB lite. К примеру, я хочу настроить приложение так, чтобы в нём использовались только EJB lite, как мне этого добиться?


Ответ

EJB Light представляет часть (наиболее часть используемую) функционала по сравнению с полноценным EJB, что по идее должно позволять запускать приложения базирующиеся на EJB Light на более легковесных версиях серверов приложений (application server) так называемый jee web-profile. Реализующие web-profile сервера можно посмотреть здесь
EJB Light 3.2 поддерживает все то же что и EJB 3.2 кроме:
Удаленных интерфейсов (remote interfaces) Бинов управляемых сообщениями (message-driven) Эндпоинтов для JAX-WS Web-сервисов RMI-IIOP Атрибут persistent для аннотации @Schedule (реализует cron подобный запуск методов)
Каким образом определяется, какой тип EJB-компонентов будет использоваться в приложении? То есть, каким образом можно понять/сконфигурировать то, будут ли использоваться EJB Lite или полноценные EJB?
Зависит от самого сервера и от того реализует он полноценную Java EE спецификацию (Full Platform) или Web Profile. Но разумеется если вы используете функции которые не поддерживаются в Web Profile то на сервере реализующем Web Profile такое приложение не запустится. Так же если сервер реализует Full Platform то неважно используете ли вы функцию из EJB Lite или EJB будет использоваться один и тот же EJB 3.2 Full API движок.

Судя по документации WildFly web profile запускается по умолчанию, для изменения режима работы (Full Plaform <-> Web Profile) необходимо запускать сервер с разной конфигурацией.
Например (запуск Full Plaform):
./standalone.sh --server-config=standalone-full-ha.xml
Конфигурация определяет подключенный модули сервера блок extensions. Отличия Full Platform для версии сервера 10.1.0.CR1 заключаются в наличие следующих модулей:

четверг, 11 октября 2018 г.

Ejb совместно c Spring

Как в spinge использовать EJB классы.
Да EJB не очень, тем более в библиотеке использовать спринг или ejb - это жесть, но что досталось то приходится пока использовать. Есть вопросы
Как спринг дружит с EJB с аннотациями типа stateless, ejb, и даже ConcurrencyManagement Если сервер приложений поднимает эти бины при запуске, как спринг делает их своими бинами и делает ли своими бинами или какая то прокся между бинами управляемые сервером приложений и бинами спринга Как отключить поднятие EJB бинов сервером приложений и чтобы такие бины управлялись спрингом путем сканирования этих пакетов либо же просто через конфигурацию


Ответ

Если коротко, только получать их от сервера приложений через JNDI.
Контейнер Spring и контейнер EJB/CDI - это два разных, хоть и похожих, мира. У бинов Spring и EJB разный жизненный цикл, а у контейнеров разные механизмы обеспечения этого жизненного цикла. Отсюда ответы на ваши вопросы:
Никак не дружит. Эти аннотации анализирует и действует в соответствии с ними CDI-контейнер. Когда Spring встречает поле, в которое нужно внедрить зависимость, он ищет эту зависимость в контексте. А появиться зависимость в контексте может разными способами - в результате вызова конструктора объявленного в конфигурации бина, в результате вызова фабричного метода какого-нибудь класса, в результате JNDI-запроса. Как раз последним способом контекст Spring и получает EJB от сервера приложений. Никак. Spring не сможет самостоятельно управлять EJB.
Так что вам придётся запустить ваше Spring-приложение, включающее EJB-компоненты, на сервере приложений, добавить в конфигурацию контекста что-нибудь вроде


и убедиться в наличии соответствующего сеттера в бине Spring
public class SomeSpringBean { private SomeEJB someEjb;
public void setSomeEjb(SomeEJB someEjb) { this.someEjb = someEjb; } }
Почитать можно здесь