Помимо EAR и EJB, что я получаю от сервера приложений Java EE, чего я не получаю в контейнере сервлетов, таком как Tomcat?

Мы используем Tomcat для размещения наших приложений на основе WAR. Мы являемся J2EE-приложениями, совместимыми с контейнером сервлетов, за исключением org.apache.catalina.authenticator.SingleSignOn.

Нас просят перейти на коммерческий сервер приложений Java EE.

  1. Первый недостаток изменений, который я вижу, - это стоимость. Независимо от стоимости сервера приложений Tomcat предоставляется бесплатно.
  2. Во-вторых, сложность. Мы не используем ни функции EJB, ни EAR (конечно, не можем) и не упустили их.

Каких же преимуществ я не вижу?

Какие недостатки я не упомянул?


Упомянутые были ...

  1. JTA - Java Transaction API - мы контролируем транзакции с помощью хранимых процедур базы данных.
  2. JPA - Java Persistence API - мы используем JDBC и снова хранимые процедуры для сохранения.
  3. JMS - Java Message Service - мы используем XML поверх HTTP для обмена сообщениями.

Это хорошо, пожалуйста, еще!


person dacracot    schedule 06.11.2008    source источник
comment
Хороший вопрос. Иногда я также задавался вопросом о достоинствах правильного сервера приложений по сравнению с Tomcat.   -  person Jonik    schedule 17.05.2010


Ответы (5)


Если вам не нужен собственно EJB, вам не нужен J2EE-сервер с полным стеком (коммерческий или нет).

У вас может быть большинство функций J2EE (таких как JTA, JPA, JMS, JSF) без сервера J2EE с полным стеком. Единственное преимущество j2ee с полным стеком состоит в том, что контейнер будет декларативно управлять всем этим от вашего имени. С появлением EJB3, если вам нужны сервисы, управляемые контейнером, их использование - это хорошо.

У вас также может быть бесплатный сервер полного стека, такой как Glasfish, Geronimo или JBoss.

Вы также можете запускать встроенные сервисы, управляемые контейнером j2ee, например, со встроенным Glasfish прямо внутри Tomcat.

Вам может понадобиться контейнер EJB, если вы хотите использовать компоненты сеанса, компоненты сообщений, компоненты таймера, которые хорошо управляются за вас, даже с кластеризацией и переключением при отказе.

Я бы посоветовал руководству рассмотреть возможность обновления в зависимости от потребности в функциях. Некоторые из этих контейнеров EJB могут просто использовать встроенный Tomcat в качестве своего веб-сервера, так что же это дает!

Некоторым менеджерам просто нравится платить за вещи. Попросите их рассмотреть вопрос о пожертвовании городского жилья или просто пойти на BEA.

person Florin    schedule 06.11.2008
comment
JBoss использует Tomcat в качестве встроенного контейнера сервлетов - person Dónal; 06.11.2008
comment
Примечание для читателей, после этого ответа несколько вещей изменились; можно даже сказать потому что таких ответов :) Теперь вы можете получить меньше, чем полный стек через веб-профиль. Теперь существует сертифицированная версия Tomcat (TomEE), ставящая ее на один уровень с GlassFish или JBoss. CDI был добавлен и доказал, что за последние год или два он стал одним из основных факторов, привлекающих Java EE. - person David Blevins; 09.02.2012
comment
@David Blevins У меня есть приложение с полным стеком Glassfish Jee, которое использует большую часть материала, но оно не огромно. Думаю поставить на TomEE. Одна из моих проблем заключается в том, что я настроил класс JDBCRealm для обработки отношений между пользователями и группами. Является ли это серьезной проблемой с TomEE (то есть что делать это труднее)? Также как насчет консолей управления для настройки JMS и пулов / JNDI (ОК, настройка источников данных JNDI). Такие вещи. Я вижу много хороших вещей в TomEE и очень хочу его попробовать, но не хочу показаться вонючим, но у меня не так много времени, чтобы заставить его работать. TIA. - person Bill Rosmus; 30.09.2012
comment
@BillR С точки зрения безопасности - это Tomcat. У Tomcat есть JDBCRealm, и я подозреваю, что он поразительно похож на GlassFish. Что касается остальной части конфигурации, TomEE проверяет, что нужно вашему приложению, и создает все для вас. Имена JNDI также просты, если вы используете стандартные java:comp/env имена. Вот что я вам скажу, если вы хотите написать в блоге сообщение о том, как опробовать свое приложение на TomEE, я буду рад оказать вам прямую помощь (Skype, мгновенное сообщение и т. Д.). Наверное, займёт только день. - person David Blevins; 01.10.2012
comment
@DavidBlevins Я бы согласился ... сначала нужно проверить JDBCRealm. Я всегда получаю похвалы за свои технические статьи. Так что помощь стоит того. Я буду связан на следующие пару дней, но на этой неделе точно, если вы будете доступны. - person Bill Rosmus; 01.10.2012
comment
@BillR Отлично. На этой неделе на JavaOne. На следующей неделе открыта. dblevins (at) apache.org - person David Blevins; 01.10.2012

Когда мы поставили перед собой цель сертифицировать Java EE 6 Apache Tomcat как Apache TomEE, вот некоторые из пробелов, которые у нас были заполнить, чтобы окончательно сдать Java EE 6 TCK.

Не полный список, но некоторые основные моменты, которые могут быть неочевидными даже при существующих ответах.

Нет TransactionManager

Управление транзакциями обязательно необходимо для любого сертифицированного сервера. В любом веб-компоненте (сервлете, фильтре, слушателе, управляемом компоненте jsf) вы должны иметь возможность ввести UserTransaction следующим образом:

  • @Resource UserTransaction transaction;

Вы должны иметь возможность использовать javax.transaction.UserTransaction для создания транзакций. Все ресурсы, которых вы касаетесь в рамках этой транзакции, должны быть зарегистрированы в этой транзакции. Сюда входят, помимо прочего, следующие объекты:

  • javax.sql.DataSource
  • javax.persistence.EntityManager
  • javax.jms.ConnectionFactory
  • javax.jms.QueueConnectionFactory
  • javax.jms.TopicConnectionFactory
  • javax.ejb.TimerService

Например, если в сервлете вы запускаете транзакцию, тогда:

  • Обновите базу данных
  • Отправить сообщение JMS в тему или очередь
  • Создайте таймер для работы позже

.. и затем одна из этих вещей не работает, или вы просто решаете вызвать rollback() на UserTransaction, тогда все эти вещи отменяются.

Нет пула подключений

Чтобы быть предельно ясным, существует два типа пула соединений:

  • Пул соединений с учетом транзакций
  • Пул соединений без поддержки транзакций

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

В основном это означает:

  • Все участники одной транзакции должны иметь одно и то же соединение из пула.
  • Соединение не должно возвращаться в пул до тех пор, пока транзакция не завершится (фиксация или откат), независимо от того, вызвал ли кто-то close() или какой-либо другой метод на DataSource.

Распространенной библиотекой, используемой в Tomcat для пула соединений, является commons-dbcp. Мы хотели также использовать это в TomEE, однако он не поддерживал пул соединений с учетом транзакций, поэтому мы фактически добавили эту функциональность в commons-dbcp (yay, Apache), и она присутствует в commons-dbc версии 1.4.

Обратите внимание, что добавления commons-dbcp в Tomcat по-прежнему недостаточно для создания пула транзакционных соединений. Вам по-прежнему нужен диспетчер транзакций, и вам по-прежнему нужен контейнер для регистрации соединений с TransactionManager через Synchronization объектами.

В Java EE 7 говорится о добавлении стандартного способа шифрования паролей БД и их упаковки с приложением в безопасный файл или внешнее хранилище. Это будет еще одна функция, которую Tomcat не будет поддерживать.

Нет интеграции безопасности

Безопасность WebServices, JAX-RS SecurityContext, EJB security, JAAS login и JAAC - все это концепции безопасности, которые по умолчанию не «подключаются» в Tomcat, даже если вы индивидуально добавляете библиотеки, такие как CXF, OpenEJB и т. Д.

Все эти API, конечно, должны работать вместе на сервере Java EE. Нам пришлось немало поработать, чтобы заставить все это взаимодействовать и сделать это поверх Tomcat Realm API, чтобы люди могли использовать все существующие реализации Tomcat Realm для обеспечения своей безопасности «Java EE». Это все еще безопасность Tomcat, просто она очень хорошо интегрирована.

Интеграция с JPA

Да, вы можете поместить поставщика JPA в файл .war и использовать его без помощи Tomcat. При таком подходе вы не получите:

  • @PersistenceUnit EntityManagerFactory инъекция / поиск
  • @PersistenceContext EntityManager инъекция / поиск
  • EntityManager подключен к пулу соединений с поддержкой транзакций
  • JTA-Managed EntityManager поддержка
  • Расширенные контексты сохраняемости

JTA-Managed EntityManager в основном означает, что два объекта в одной транзакции, которые хотят использовать EntityManager, будут видеть одно и то же EntityManager, и нет необходимости явно передавать EntityManager. Все это «прохождение» за вас делает контейнер.

Как этого добиться? Просто EntityManager, который вы достали из контейнера, - подделка. Это обертка. Когда вы его используете, он ищет в текущей транзакции реальный EntityManager и делегирует вызов этому EntityManager. Это причина таинственного EntityManager.getDelegate() метода, поэтому пользователи могут получить настоящий EntityManager, если захотят, и использовать любые нестандартные API. Конечно, делайте это с большой осторожностью и никогда не храните ссылку на делегата EntityManager, иначе вы получите серьезную утечку памяти. Делегат EntityManager обычно очищается, закрывается, очищается и отбрасывается после завершения транзакции. Если вы все еще держитесь за ссылку, вы предотвратите сборку мусора для этого EntityManager и, возможно, всех содержащихся в нем данных.

  • Всегда безопасно хранить ссылку на EntityManager, полученную из контейнера.
  • Ссылка на EntityManager.getDelegate() небезопасна.
  • Будьте очень осторожны, ссылаясь на EntityManager, который вы создали сами с помощью EntityManagerFactory - вы на 100% отвечаете за его управление.

Интеграция CDI

Я не хочу чрезмерно упрощать CDI, но я считаю, что он слишком велик, и многие люди не смотрят серьезно - он входит в список «когда-нибудь» для многих :) Итак, вот лишь пара основных моментов, которые Я думаю, что "веб-парень" хотел бы знать об этом.

Вы знаете все, что вам нужно сделать в типичном веб-приложении? Вытаскивать и вынимать вещи HttpSession весь день? Использование String для ключа и непрерывное преобразование объектов, которые вы получаете от HttpSession. Вы, вероятно, использовали служебный код, чтобы сделать это за вас.

У CDI тоже есть этот служебный код, он называется @SessionScoped. Любой объект, помеченный @SessionScoped, помещается и отслеживается в HttpSession для вас. Вы просто запрашиваете внедрение объекта в ваш сервлет через @Inject FooObject, и контейнер CDI будет отслеживать «настоящий» экземпляр FooObject так же, как я описал отслеживание транзакций EntitityManager. Абракадабра, теперь можно удалить кучу кода :)

Делаете какие-нибудь getAttribute и setAttribute на HttpServletRequest? Что ж, вы можете удалить и это с помощью @RequestScoped таким же образом.

И, конечно, есть @ApplicationScoped для устранения вызовов getAttribute и setAttribute, которые вы могли бы делать на ServletContext

Чтобы сделать вещи еще круче, любой объект, отслеживаемый таким образом, может реализовать @PostConstruct, который вызывается при создании bean-компонента, и метод @PreDestroy, который будет уведомлен, когда указанная «область действия» завершена (сеанс завершен, запрос завершен, приложение выключается).

CDI может намного больше, но этого достаточно, чтобы кто-нибудь захотел переписать старое веб-приложение.

Некоторые придирчивые вещи

В Java EE 6 добавлены некоторые вещи, которые не были добавлены в рулевой рубке Tomcats. Они не требуют больших объяснений, но составили большую часть «заполнения пробелов».

  • Поддержка @DataSourceDefinition
  • Поддержка Global JNDI (java:global, java:app, java:module)
  • Внедрение Enum через @Resource MyEnum myEnum и
  • Внедрение класса через @Resource Class myPluggableClass и
  • Поддержка @Resource(lookup="foo")

Незначительные моменты, но может быть невероятно полезно определить DataSource в приложении переносимым способом, обмениваться записями JNDI между веб-приложениями и иметь простую возможность сказать «найдите эту штуку и внедрите ее».

Вывод

Как уже упоминалось, не полный список. Никакого упоминания EJB, JMS, JAX-RS, JAX-WS, JSF, Bean Validation и других полезных вещей. Но по крайней мере некоторое представление о вещах, которые часто упускаются из виду, когда люди говорят о том, что такое Tomcat, а что нет.

Также имейте в виду, что то, что вы могли представить как «Java EE», может не соответствовать фактическому определению. С появлением веб-профиля Java EE сократился. Это было намеренно, чтобы сказать: «Java EE слишком тяжелый, и мне все это не нужно».

Если вы удалите EJB из веб-профиля, вот что у вас останется:

  • Сервлеты Java
  • Java ServerPages (JSP)
  • Java ServerFaces (JSF)
  • API транзакций Java (JTA)
  • Java Persistence API (JPA)
  • Внедрение контекстов и зависимостей Java (CDI)
  • Бин-валидация

Это чертовски полезный стек.

person David Blevins    schedule 08.02.2012
comment
Эта часть «Соединение не должно возвращаться в пул до завершения транзакции». Это кажется наиболее разумным, но почему в Hibernate есть hibernate.connection.release_mode, который по умолчанию - after_statement в средах JTA, и почему OpenJPA имеет openjpa.ConnectionRetainMode, по умолчанию по запросу? Ссылки: docs.jboss.org /hibernate/orm/4.1/manual/en-US/html_single/ openjpa.apache.org/builds/2.2.1/apache-openjpa/docs/ - person marcus; 28.12.2012
comment
@marcus Обратите внимание на то, что на этих страницах не указано JTA, они говорят о транзакции. По сути, эти настройки работают только для <persistence-unit transaction-type="RESOURCE_LOCAL"> и только тогда, когда приложение создало EntityManagerFactory через javax.persistence.Persistence factory. EntityManagerFactory экземпляры, созданные контейнером, будут созданы через javax.persistence.spi.PersistenceProvider#createContainerEntityManagerFactory(PersistenceUnitInfo, Map). Контейнер будет предоставлять свои собственные управляемые источники данных напрямую через интерфейс PersistenceUnitInfo. - person David Blevins; 11.01.2013
comment
Первый ясно говорит: «Для источника данных JTA сервера приложений используйте after_statement для агрессивного освобождения соединений после каждого вызова JDBC». Я что-то упускаю? - person marcus; 12.01.2013
comment
Я подозреваю, что документы Hibernate рекомендуют освобождать соединение после каждого вызова при использовании источника данных JTA сервера приложений, потому что они знают, что всегда будут получать одно и то же соединение для всех будущих вызовов, пока транзакция активна. Что-то вроде подхода «не беспокойся об управлении тем, чем уже управляли». - person David Blevins; 12.01.2013

Если вас просят перейти на коммерческий сервер J2EE, причины могут быть не связаны со стеком J2EE, а связаны с нетехническими соображениями.

Одна вещь, которую вы получаете с коммерческим предложением J2EE, чего вы не получаете с Tomcat, - это техническая поддержка.

Это может не быть для вас проблемой, в зависимости от уровней обслуживания, которым должны соответствовать ваши веб-приложения. Могут ли ваши приложения не работать, пока вы пытаетесь выяснить проблему с Tomcat, или это будет серьезной проблемой?

person Michael Sharek    schedule 06.11.2008

Стоимость не обязательно является недостатком, так как есть несколько бесплатных серверов J2EE, например JBoss и Glassfish.

В вашем вопросе предполагается, что (J2EE = Servlet + EJB + EAR) и, следовательно, нет смысла использовать что-либо, кроме контейнера сервлета, если вы не используете EJB или EAR. Это просто не так, J2EE включает намного больше, чем это. Примеры включают:

  • JTA - API транзакций Java
  • JPA - API сохраняемости Java
  • JMS - спецификация обмена сообщениями Java
  • JSF - технология построения пользовательских интерфейсов из компонентов

Ура, Донал

person Dónal    schedule 06.11.2008
comment
Мы используем JSF без контейнера J2EE. - person dacracot; 06.11.2008
comment
Я не упомянул конкретный сервер приложений J2EE, чтобы он не стал предметом флейминга, но за него есть ценник. - person dacracot; 06.11.2008
comment
Я не говорю, что вам нужно использовать сервер приложений J2EE для использования любой из этих технологий, просто подчеркивая, что J2EE - это нечто большее, чем EJB, сервлеты и EAR. - person Dónal; 06.11.2008

По правде говоря, с огромным набором доступных пакетов и библиотек, контейнер EJB не может быть добавлен в современный контейнер сервлетов (как Tomcat). Итак, если вам когда-либо понадобилась какая-либо из этих функций, вы можете получить их «аля карт», так сказать, со стоимостью процесса интеграции этой функции в ваше приложение.

Если сейчас вы не «упускаете» ни одну из этих функций, то с практической точки зрения они вам, вероятно, не нужны.

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

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

Тем не менее, я настоятельно рекомендую вам приобрести его, поэкспериментировать с ним и изучить платформу. Начать работу с Glassfish очень легко, она очень хороша и должна легко принимать ваши WAR-файлы как есть (или с очень незначительными изменениями).

Как правило, когда дело доходит до запуска Tomcat и контейнера EJB, действительно возникает вопрос: почему НЕ использовать его? Говоря конкретно о Glassfish, я считаю, что его проще использовать, чем Tomcat, и его основное отличие состоит в том, что он может иметь умеренно больший объем памяти (особенно для небольшого приложения), чем Tomcat, но в большом приложении вы даже не заметите этого . Для меня проблема с памятью не имеет большого значения, для других это может быть проблемой.

И это дает мне единый источник всей этой прекрасной функциональности без необходимости сканировать сеть в поисках стороннего варианта.

person Will Hartung    schedule 06.11.2008
comment
Явным преимуществом развертывания EAR является то, что вся проводка может быть указана внутри, вместо того, чтобы явно настраивать Tomcat для предоставления нескольких дополнительных услуг. Чем больше можно автоматизировать, тем лучше. - person Thorbjørn Ravn Andersen; 18.03.2010
comment
Отличный ответ, и, безусловно, самый четкий здесь. То, что вы говорите, в основном совпадает с моим пониманием этого вопроса: при использовании Tomcat нет реальной необходимости переключаться, поскольку вы все равно можете добавить почти любую функцию JEE, но если начать заново, вероятно, будет проще использовать хороший бесплатный сервер приложений, такой как JBoss или Стеклянная рыба. - person Jonik; 17.05.2010