Создание потока в контейнерах JavaEE EJB/Web

Я читал в книге Adam Bien's JavaEE night hacks, что, хотя создание потоков запрещено в EJB-контейнерах, это не относится к веб-контейнерам. На самом деле он создает исполнительный пул потоков в своем рентгеновском зонде, работающем на Tomcat.

Я немного смущен сейчас. Хотя я сталкивался с ситуациями, когда мне приходилось вручную управлять пулом потоков в приложении EE, я каким-то образом понимаю, почему было бы плохой идеей вручную создавать потоки в контейнере JavaEE. Однако я не понимаю разницы между EJB-контейнером и веб-контейнером в отношении создания потоков, когда вы можете развернуть большую часть EJB в любом из них. Если нет ничего плохого в том, что сеансовый компонент порождает потоки в веб-контейнере, какая проблема может возникнуть при развертывании того же сеансового компонента в контейнере EJB?


person Arash Shahkar    schedule 31.10.2012    source источник


Ответы (3)


Именно здесь корпоративная часть Java EE встречается с реальным миром.

Предпосылка использования системы «Предприятие» в основном сосредоточена вокруг управления. В частности, передача решений и конфигурации контейнеру вместо того, чтобы полагаться на само приложение для управления этими ресурсами. Отделив создание ресурсов и управление ими от кода приложения и полагаясь на контейнер, системный администратор получает видимость и доступ к этим ресурсам и, таким образом, имеет возможность настраивать и контролировать приложения на более высоком уровне и обычным способом. , чем использовать для этого специальные механизмы приложения.

Итак, это среда, в которой мы находимся, и это часть того, что движет этими «правилами» спецификации Java EE о том, что вы можете и не можете (не должны) делать.

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

Это дает вам две «противоречивые» спецификации с точки зрения конкретных вещей (например, потоков).

Итак, да, спецификация сервлета «позволяет вам» управлять вашими собственными пулами потоков, даже в приложении Java EE, хотя эти пулы потоков, вероятно, будут в той же самой JVM (и, таким образом, «неуправляемо» потребляя ресурсы Java EE), что и приложение Java EE. Контейнер Java EE.

В конечном итоге это означает, что в реальном мире, да, если вы хотите, вы можете спулировать потоки и тому подобное в контейнере Java EE или в контейнере сервлетов. Ни один из популярных контейнеров не запрещает вам это делать (WebSphere может, я им не пользуюсь).

Но вы не должны. В Java EE (особенно в Java EE 6) есть механизмы и обручи, через которые вы можете переходить, чтобы делать что-то вместо использования пулов потоков. Такие вещи, как WorkManagers, очереди JMS, асинхронные сеансовые компоненты, задания таймера.

В приложении сервлета большинство этих механизмов не существует, поэтому вы не можете использовать их, и вместо этого вы используете «просто Java».

Последствия использования «Просто Java» в веб-приложении, развернутом с помощью приложения Java EE, — это видимость внутри контейнера. Вашему веб-приложению потребуется собственная переменная конфигурации, например, для настройки размера пула потоков, и оно не может полагаться на контейнер для управления этим.

В конце концов, это обычно не имеет большого значения. Большая часть сложности Java EE связана с возможностями управления, которые многие люди не используют. Что касается меня, я использую Java EE и редко использую простую WAR, мне нравится помещать в контейнер как можно больше — пусть он делает свою работу. Тем не менее, у меня есть настраиваемые серверы сокетов, работающие в WAR в контейнерах Java EE, нарушающие все мыслимые правила просто потому, что это было намного проще сделать. «Путь Java EE» не был достаточно гибким для того, что мы хотели сделать, поэтому мы выбрали «Просто Java» и влили код в WAR, чтобы мы могли играть на Диком, Диком Западе, где мужчины были мужчинами и управлял своими потоками.

person Will Hartung    schedule 31.10.2012
comment
Спасибо за исчерпывающий ответ Уилл. У меня нет большого опыта в Java EE, но я не думаю, что легкость всегда является причиной нарушения этих правил, несмотря на то, что платформа, кажется, обладает всеобъемлющим характером. - person Arash Shahkar; 31.10.2012

EJB управляются сервером. Управление означает, т.е. внедрение зависимостей. Если вы создаете поток из класса с использованием аннотаций, сервер не сможет их обработать (сделать @PostConstruct, вставить ссылки и т. д.).

person Przemysław Kowalczyk    schedule 31.10.2012
comment
Это единственная проблема? Если я хочу выполнять многопоточные вычисления или сетевые операции без использования средств, управляемых контейнером, рекомендуется ли вручную создавать пулы потоков? - person Arash Shahkar; 31.10.2012
comment
Пулы потоков управляются сервером/контейнером, и так и должно оставаться. Вы уверены, что ваши вычисления не могут быть выполнены bean-компонентами с состоянием/без состояния? Потому что это философия Enterprise Java Beans — забудьте о потоках, используйте bean-компоненты. Но это не значит, что вы не можете создавать потоки в контейнере EJB... - person Przemysław Kowalczyk; 31.10.2012
comment
Кроме того, насколько я помню (не могу найти точной ссылки), контейнер EJB занимает столько памяти, сколько может (и управляет ею), поэтому создание потоков, требующих памяти, может вызвать исключения из памяти, потому что контейнер делает не освобождать его, как это происходит с другими управляемыми им объектами. - person Przemysław Kowalczyk; 31.10.2012

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

Однако сервлеты и фильтры выполняются в веб-контейнере, и ничто не мешает им иметь собственные пулы потоков, управляемые вручную.

person Arash Shahkar    schedule 31.10.2012