Связаны ли управляемые сообщениями компоненты (MDB) с теми же ограничениями, что и другие компоненты EJB? - PullRequest
1 голос
/ 17 апреля 2011

В компоненте, управляемом сообщениями, я ограничен теми же правилами для сеансовых компонентов (EJB3 или EJB3.1), то есть:

  • для доступа к Java Reflection API java.lang.reflectинформация, недоступная посредством правил безопасности среды выполнения Java
  • чтение или запись нефинальных статических полей
  • , используется для ссылки на экземпляр в параметре метода или в результате
  • пакеты доступа (и классы), которые в противном случае становятся недоступными по правилам языка программирования Java
  • определяют класс в пакете
  • используйте пакет java.awt для создания пользовательского интерфейса
  • создание или изменение загрузчиков классов и менеджеров безопасности
  • перенаправление потоков ввода, вывода и ошибок
  • получение информации о политике безопасности для источника кода
  • доступ или изменение безопасностиобъекты конфигурации
  • создание или управление потоками
  • использование примитивов синхронизации потоков для синхронизации доступа с другими входамиэкземпляры призового компонента
  • остановить виртуальную машину Java
  • загрузить собственную библиотеку
  • прослушивать, принимать подключения или многоадресную рассылку из сетевого сокета
  • изменитьфабрики сокетов в java.net.Socket или java.net.ServerSocket, или измените фабрику обработчика потока java.net.URL.
  • , непосредственно читайте или пишите дескриптор файла
  • создайте, изменитеили удалите файлы в файловой системе
  • , используя функции подкласса и подстановки объектов протокола сериализации Java

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Не рекомендуется создавать потоки вручную (хотя в некоторых случаях ExecutorService выглядит нормально).

На самом деле MDB очень часто используются для устранения этого ограничения: вместо создания отдельного потока отправьте некоторый объект задачи (поместите что-то вроде MyJob extends Serializable в ObjectMessage) в очередь и разрешите ему выполняться в пуле потоков MDB. Этот подход намного тяжелее, но масштабируется очень хорошо, и вам не нужно управлять какими-либо потоками вручную. В этом сценарии JMS - это просто модный способ асинхронного выполнения заданий.

0 голосов
/ 18 апреля 2011

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

Время от времени некоторые очень суетливые провайдеры EJB-контейнеров (кашель .... WebSphere ... кашель) фактически применяют эти ограничения с помощью политик безопасности Java, но я бы сказал, что примерно половина из этих ограничений обычноигнорируется (я имею в виду, что использование log4j в вашем MDB потенциально нарушает около 30% из них).

Нарушение остальных 70%, вероятно, указывает на некоторые архитектурные или конструктивные проблемы.

Итак, вы можете вызвать System.exit () в MDB? ответ - это да, но только один раз ...:)

Похоже, в вашем случае вам необходимо некоторые из этих ограничений, чтобы править потенциально недостойным поведениемплагины.Я не знаю, собираются ли МБР вытащить вас из этой проблемы.Я полагаю, это зависит от того, насколько вы доверяете сторонним разработчикам, но вместо того, чтобы использовать модели на основе вызовов в EJB, я бы установил компоненты как JMX ModelMBeans.Вы можете использовать модель безопасности java, чтобы ограничить то, что они могут делать, но я полагаю, что это может нанести ущерб цели.

Возможно, используя некоторое время разработки (или загрузки) алгоритма байт-кода AOP, вы могли бы переписать все запросы на потоки.быть перенаправленным на фабрику потоков для каждого компонента, которую вы выделяете, и ограничивает потоки, которые могут быть созданы.Поскольку вы не хотите мешать им делать то, что они делают, вы просто не хотите, чтобы они отключали весь сервер, когда они терпят крах / зависают / плохо себя ведут.

Интересная проблема.

...