Спецификация EJB 3.0 не позволяет бизнес-методу сессионного компонента без сохранения состояния создавать новые потоки. Почему это так?
Краткая версия: управление потоками из EJB запрещено, потому что это может нанести ущерб управлению ресурсами, управлению транзакциями, безопасности (технические причины), а также потому, что это то, что модель EJB не хочет продвигать (философская причина).
В спецификации EJB это выглядит так:
21.1.2 Ограничения программирования
...
- Корпоративный компонент не должен пытаться управлять потоками. Корпоративный компонент не должен пытаться запустить, остановить, приостановить или возобновить поток или изменить приоритет или имя потока. Корпоративный компонент не должен пытаться управлять группами потоков.
Эти функции зарезервированы для контейнера EJB. Разрешение корпоративному бину управлять потоками уменьшит способность контейнера правильно управлять средой выполнения.
Смотри также
(...) Если бы я использовал стороннюю библиотеку обработки изображений, которая внутренне создает рабочие потоки, я бы также нарушил спецификации EJB, даже если эта библиотека и эти потоки не имеют никакого отношения к контейнеру EJB вообще. Это не кажется правильным.
Что я могу сказать, не используйте EJB, если вам это не нравится.
Что может произойти, если я проигнорирую правила EJB и по-прежнему создаю несколько рабочих потоков для интенсивной обработки ЦП? Конечно, эти потоки никогда не будут касаться каких-либо объектов сервера приложений, и поток бобов присоединится к ним перед возвратом. Может ли что-то еще случиться?
Неважно, касаются ли эти потоки объектов сервера приложений. Правила есть правила, вы не хотите им следовать, вы сами по себе, и поведение не определено. Некоторые контейнеры могут быть более допустимыми и разрешать это, другие - нет, ваше приложение не будет переносимым и т. Д. Но это все равно явно запрещено.
Если вы хотите «порождать» потоки стандартным способом, используйте API WorkManager или JMS.
Смежные вопросы