Как внедрить сторонний код в среду Java EE, где используется EJB3 - PullRequest
1 голос
/ 03 февраля 2012

Я пишу веб-приложение, которое работает на GlassFish 2.1.1. На самом деле это приложение содержит только один сессионный компонент без сохранения состояния, который использует классы из сторонних библиотек. Экземплярами этих классов являются сервисы, которые создают много потоков с самостоятельным управлением во время выполнения. Я прочитал в EJB Restrictions, что создание потоков в EJB не является хорошей идеей.

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

Единственная идея, которая у меня есть, - создать экземпляр службы в сервлете и передать экземпляр с помощью вызова метода в EJB. Будет ли это лучше?

спасибо заранее Alex

Еще несколько подробностей о моем проекте:

Библиотека, которую я должен использовать, определенно не создана для EJB-контейнера. Однако у меня нет выбора. Я также немного изменил свой дизайн, который я пытаюсь объяснить кратко. Основной целью моего веб-приложения является обработка заданий. В основном это похоже на сервер CI Hudson. Работа - это что-то другое, а не сборка задач. Тем не менее, задания могут быть запущены через веб-интерфейс. Если пользователь нажимает кнопку запуска, в таблицу базы данных вставляется только запись с состоянием. Таблица базы данных используется в качестве очереди выполнения. Другой компонент, TimerBean, будет периодически проверять базу данных и вызывать инженера, который является моей библиотекой из трех сторон, для обработки этой работы. Обработка заданий отделена от клиента, и никакие транзакции не требуются.

  1. Сохраняет ли он состояние между вызовами методов? Да, я должен сохранить текущую работу, чтобы отменить выполнение. Я решил это с помощью статической переменной. Я знаю, что это также то, что я не должен делать в EJB, но EJB никогда не будет использоваться для кластеризации.
  2. Доступ к файлам, открытие соединений? Третья сторона библиотеки читает и пишет файлы.
  3. Синхронизирует ли потоки, используя общие ресурсы, например, класс переменные? Я не знаю внутренностей сторонней библиотеки, но я полагаю, да!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2012

Экземплярами этих классов являются сервисы, которые создают много потоков с самостоятельным управлением во время выполнения

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

Некоторые другие вопросы, которые вы можете задатьЗадайте вопрос:

  1. Поддерживает ли он состояние между вызовами методов?
  2. Имеет ли он доступ к файлам, открывает соединения?
  3. Синхронизирует ли он потоки с использованием общих ресурсов, таких как переменные класса?

Поскольку ваша библиотека, вероятно, пытается масштабировать себя до среды, одним из мер предосторожности может быть проверка ее доступа через одноэлементный EJB-компонент (по крайней мере, это увеличит вероятность правильной работы наодиночная ВМ).Чтобы добиться этого в GF 2.1, вам нужно установить его в sun-ejb-jar.xml:

<ejb>
    <ejb-name>MyEJB</ejb-name>
    <jndi-name>ejb/MyEJB</jndi-name>
    <bean-pool>
        <steady-pool-size>1</steady-pool-size>
        <max-pool-size>1</max-pool-size>
    </bean-pool>
</ejb>

Вы можете инициализировать вашу библиотеку с помощью @PostConstruct метода MyEJB, для этого не нужно использовать специальный сервлет.

Это просто набросок решения, все зависит от того, как на самом деле работает библиотека.

0 голосов
/ 03 февраля 2012

Создание собственных потоков настоятельно не рекомендуется, но если вы вообще не используете транзакции и ваше приложение действительно работает, не беспокойтесь слишком много

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