Могут ли EJB2 и EJB3 сосуществовать в одном приложении?

#jakarta-ee #ejb-3.0 #ejb-2.x

#джакарта-ee #ejb-3.0 #ejb-2.x

Вопрос:

кто-нибудь знает, возможно ли итеративно заменить компоненты EJB2.1 на компоненты EJB3 в приложении Java EE?

То есть: за один раз удалите один компонент 2.1 из кода и добавьте соответствующий компонент EJB3, который реализует то же поведение, не затрагивая остальной код ( иметь возможность внедрять устаревшие EJB через аннотации в новый EJB3).

Я не эксперт в спецификациях EJB (и у меня есть опыт работы только с EJB3), но для меня EJB — это просто компонент с заданным бизнес-интерфейсом, которым управляет appserver. AFAIK EJB3 значительно упростил написание компонента (без искусственных интерфейсов), и в большинстве случаев xml-дескриптор можно опустить благодаря аннотациям, но основы те же. Так что это кажется правдоподобным, это может сработать.

Есть ли какая-либо несовместимость между EJB2.1 и EJB3?

Суть вопроса в том, должна ли миграция EJB2.1 —> EJB3 быть операцией остановки мира / полной перезаписи или это можно сделать при добавлении новой функции и исправлении ошибок в устаревшем приложении (таким образом, в запущенном приложении некоторое время будет сочетаться EJB2.1 и EJB3).

Редактировать:

  • Меня интересуют только сеансовые компоненты.
  • Мне любопытно, будет ли (и как) поиск работать. AFAIK EJB2.1 требует чего-то под названием home interface, чтобы получить ссылку на другой EJB, но EJB3 не имеет home interface …

Ответ №1:

Сосуществуют компоненты EJB 2.1 и EJB 3

Компоненты EJB2 и EJB3 могут сосуществовать в одном корпоративном приложении (.ear), но не могут находиться в одном файле jar ejb (модуле). Следовательно, компоненты EJB3 должны находиться в банке, отличной от компонентов EJB2.

Вызовите EJB 3 из EJB 2.1

Компонент EJB3 не имеет домашнего интерфейса, в то время как EJB 2.1 требует этого. Для того, чтобы компонент EJB3 мог получать доступ из EJB2, вам необходимо добавить локальный домашний интерфейс (или удаленный домашний, если требуется удаленный вызов) к компоненту EJB3.

Создать домашний интерфейс:

 public interface SystemTimeLocalHome extends EJBLocalHome {  
  SystemTimeLocal create() throws CreateException;  
}  
  

Добавьте домашний интерфейс в компонент EJB3:

 @Stateless  
@Local(TimeServiceLocal.class)  
@LocalHome(TimeServiceLocalHome.class)  
public class TimeServiceBean implements TimeServiceLocal {  
   public long getCurrentTimeMillis() {  
      return System.currentTimeMillis();  
   }  
}  
  

Внутри компонента EJB2 код для вызова компонента EJB3 просто следует спецификации EJB2: ищет ссылку, вызывает домашний интерфейс для создания локального интерфейса, затем вызывает метод в локальном интерфейсе.

 Context ctx = new InitialContext();  
TimeServiceLocalHome home = (TimeServiceLocalHome)ctx.lookup("java:comp/env/"   ejbRefName);  
TimeServiceLocal timeService = home.create();  
timeService.getCurrentTimeMillis();  
  

Вызовите EJB 2.1 из EJB 3

Внедрение зависимостей используется для внедрения ссылок на компоненты EJB 2.1 в компонент EJB3. Отличие от внедрения компонента EJB3 заключается в том, что это вводимый домашний интерфейс EJB2. Вызовите create() метод во встроенном домашнем интерфейсе EJB для создания экземпляра класса bean.

 @EJB BankingServiceHome bsHome;

BankingService bs = bsHome.create();
bs.getBalance(...);
  

Комментарии:

1. Очень полный, компактный и информативный ответ, большое вам спасибо!

2. У меня есть компоненты ejb2.1 и ejb3.1, упакованные в одно ухо. Мой сессионный компонент вызывает ejb3.1 -> создать, а затем использует это значение для установки в ejb2.1. Я запускаю работу части создания, хотя она завершается сбоем при внесении изменений в ejb2.1. Я предполагаю, что какая-то проблема с границей транзакции. Кто-нибудь сталкивался с подобной проблемой раньше?

3. Отвечая на мой собственный вопрос — вызываю EntityManager. flush () после сохранения (создания) решил проблему.

4. должен ли SystemTimeLocal по-прежнему расширять SystemTimeLocal EJBObject?

Ответ №2:

Миграция возможна, хотя и не без сбоев.

Начните с обновления дескриптора до схем Java EE 5. Обычно это флаг, который серверы используют, чтобы определить, нужно ли им сканировать аннотации.

Как только вы обновите дескриптор (но в остальном не измените), вы можете начать перенос ваших компонентов, управляемых сеансом и сообщениями, в компоненты Java EE 5. При преобразовании компонента вы также можете удалить его из дескриптора развертывания, если хотите.

После того, как все ваши другие компоненты будут выполнены, вы можете начать работать над удалением ваших компонентов entity и преобразованием сохраняемости в классы сущностей JPA. Это нетривиальная часть упражнения.

Ответ №3:

Конечно, вы можете. Посмотрите здесь для начала:http://www.coderanch.com/t/321218/EJB-JEE/java/EJB-call-EJB