Подтвердить что ты не робот

Что такое Enterprise Java Bean на самом деле?

В Tomcat FAQ говорится: "Tomcat не является сервером EJB. Tomcat - не полный J2EE-сервер".

Но если I:

  • используйте Spring для предоставления контекста приложения.
  • аннотировать мои сущности JPA аннотации (и использовать Hibernate как JPA)
  • настроить C3P0 в качестве данных объединения пулов Источник
  • аннотировать мои методы обслуживания с @Transactional (и использовать Atomikos как поставщик JTA)
  • Использовать JAXB для сортировки и разборки
  • и, возможно, добавить мою собственную функцию JNDI.

то разве у меня нет сервера приложений Java EE? А разве не мои beans EJB? Или есть еще одна определяющая характеристика?

Что означает, что сервер приложений, совместимый с Java EE, дает вам то, что вы не можете легко/легко получить от Tomcat с некоторыми сторонними подсистемами?

4b9b3361

Ответ 1

Но если я добавлю (...), то разве у меня нет сервера приложений Java EE? А разве не мои beans EJB? Или есть еще одна определяющая характеристика?

Нет, у вас нет сервера приложений Java EE, полноценный сервер приложений Java EE больше, чем Tomcat + Spring + автономный менеджер транзакций. И даже если вы добавите JMS-провайдера и EJB-контейнер, у вас все равно не будет Java EE-сервера. Клей между всеми частями является важным IMO и является частью добавленной стоимости контейнера Java EE.

Что касается EJB, спецификация EJB намного больше, чем JPA, а также спецификация Session beans и Message Driven beans (на самом деле, я не рассматриваю JPA Entities как EJB, даже если JPA является частью спецификации EJB 3.0 в Java EE 5 по историческим причинам, что больше не соответствует действительности в Java EE 6, JPA 2.0 и EJB 3.1 являются отдельными спецификациями). Следует также упомянуть, что Spring bean, аннотированный с помощью @Transactional, не эквивалентен сеансу Bean. Контейнер Java EE может выполнять больше операций с сеансом beans (см. Ниже). Возможно, они вам не нужны, но, тем не менее, они не являются строго эквивалентными.

Последняя вещь: контейнеры Java EE реализуют стандарт, контейнер Spring не является, он является проприетарным.

Что означает, что сервер приложений, совместимый с Java EE, дает вам то, что вы не можете легко/легко получить от Tomcat с некоторыми сторонними подсистемами?

Как я уже сказал, я считаю, что "клей" является частью добавленной стоимости и в значительной степени способствует надежности целого. Затем, ewernli ответ, очень хорошо подчеркнул, чего трудно достичь. Я бы добавил:

  • Кластеризация и Сбой (для обеспечения отказоустойчивости)
  • Администрирование

Да, хороший Java EE-сервер будет делать довольно аккуратные вещи для повышения отказоустойчивости (кластеризация пулов подключений, дерево JNDI, адреса JMS, автоматическая повторная попытка с idempotent beans, умные клиенты EJB, восстановление транзакций, миграция служб, и т.д). Для "критически важных" приложений - подавляющее большинство - нет - это важно. И в таких случаях библиотеки поверх API Servlet являются IMO не заменой.

Ответ 2

EJB - это компоненты JavaEE, которые соответствуют API javax.ejb.

JavaEE - это набор API-интерфейсов, вам не нужно использовать их все.

Tomcat - это "частичный" JavaEE-сервер, поскольку он реализует только некоторые из API JavaEE, такие как Servlets и JNDI. Он не реализует, например. EJB и JMS, поэтому это не полная реализация JavaEE.

Если вы добавили некоторые дополнительные биты и куски (например, OpenEJB, HornetQ), вы добавили недостающие части, и вы получите полный сервер JavaEE. Но из коробки Tomcat это не так и не пытается быть.

Ответ 3

1) Вы вводите в заблуждение объекты JPA с EJB. Хотя JPA относится к спецификации EJB3, она всегда была самостоятельной технологией.

2) EJB: stateless beans, stateful beans и управляемый сообщением beans. Хотя каждая из этих функций может быть легко достигнута с помощью spring, spring просто не использует эту терминологию. В spring у вас нет POJO + "магии", как в EJB, в spring это POJO + ваша собственная конфигурация (которая иногда также похожа на магию). Основное отличие состоит в том, что spring делает больше, а сервер приложений делает меньше, поэтому приложение spring доволен tomcat, в то время как для приложения ejb3 необходим "настоящий" сервер приложений.

На мой взгляд, 90% приложений можно развернуть с помощью spring + tomcat, ejb3 редко требуется.

Ответ 4

В самом деле, если вы приложите достаточно усилий, вы можете почти превратить Tomcat/ Spring в полноценный супертяжелый сервер приложений:) Вы даже можете встроить переносимый контейнер EJB3...

Что такое приложение, совместимое с Java EE сервер дает вам то, что вы не можете легко/легко получить от Tomcat с некоторые сторонние подсистемы?

Есть еще несколько функций, которые трудно получить с сторонними модулями:

  • сеанс с состоянием beans (SFSB)
  • расширенный контекст сохранения
  • клиентский контейнер приложения/веб-запуск java
  • кластеризация в зависимости от приложения. сервер
  • Функциональность CORBA
  • Интеграция JCA ~
  • удаленный ~
  • транзакции, управляемые контейнером ~
  • достойное управление распределенными транзакциями (например, восстановление эвристического tx)

Записи с ~ также поддерживаются Spring, но не настолько тривиально, по крайней мере, для моих лучших знаний.

Еще несколько деталей в этом ответе: EJB vs Spring

Ответ 5

Вне строгого определения того, что есть и не является EJB, вы добавляете много вещей в Tomcat. Даже если у вас есть сервер EJB, это не совсем обычный Tomcat.

Часто задаваемые вопросы: Tomcat не является EJB-сервером. Тем не менее, это может быть то или многое другое, если вы наваливаете достаточное количество дополнительных библиотек и кода.

Ответ 6

Реализация EJB была бы bean, написанной и упакованной для запуска на любом совместимом EJB-сервере. Если вы выполняете то, что описываете, оно может работать, но оно не будет переноситься на другой сервер приложений поставщика.

Итак, EJB - это стандарт, который придерживается конкретной спецификации и поэтому переносится.

На практике многие EJB не полностью совместимы или нейтраль сервера приложений. Однако в основном это так, поэтому небольшая несовместимость будет намного легче исправить, если вы измените поставщиков серверов приложений, чем попытаетесь переместить описанную вами архитектуру на сервер GlassFish, JBoss или Weblogic.

EDIT: в ответ на ваш комментарий у вас не будет EJB, соответствующим образом аннотированный и/или настроенный с помощью XML таким образом, чтобы код, который обращался к нему по EJB-совместимым способам, мог бы использовать его без изменений.

В вашем комментарии есть два угла. Во-первых, какую функциональность вы потеряете при развертывании на JBoss или любом другом, а не Tomcat? Наверное, ничего, если бы вы взяли на себя все рамки, на которые вы опирались. Однако, если вы хотите переместить свой код в Weblogic, например, чтобы использовать некоторые из его функций, тогда вашему коду понадобятся некоторые вероятные значительные изменения, чтобы не отставать.

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

Ответ 7

тогда я не могу эффективно использовать Java EE сервер приложений? И тогда не мои beans EJB? Или есть другие определяющая характеристика?

Быстрый ответ EJB действительно должен соответствовать спецификации Java EE. Tomcat - контейнер Java EE, а не сервер приложений.

Что такое приложение, совместимое с Java EE сервер дает вам то, что вы не можете легко/легко получить от Tomcat с некоторые сторонние подсистемы?

Быстрый ответ на второй вопрос. В вашем случае, скорее всего, ничего.

EJBs, как правило, являются действительно тяжелыми объектами, и люди в конечном итоге используют их для решения проблем, когда они по существу являются излишними. Для решения этих проблем были созданы такие структуры, как Spring без использования EJB. Я думаю, что первая книга, в которой была введена Spring, даже называлась "разработка J2EE без EJB".