Я создаю приложение Java EE, которое позволяет пользователям добавлять / удалять таблицы socketinfo (хранящиеся в базе данных) из веб-интерфейса. Если пользователь разрешает "информацию о сокетах" через веб-интерфейс, сервер приложений должен создать прослушиватель сокетов для входящих пакетов и обработать данные. Если пользователь отключает или удаляет "socketinfo", прослушиватель сокета должен быть удален. Весь продукт должен содержаться в одном ухе и предпочтительно соответствовать требованиям. Вот некоторые подходы, которые я рассмотрел, но с которыми столкнулся:
Создайте адаптер ресурсов JCA для сокетов и используйте MDB в качестве слушателей. Проблема, с которой я столкнулся, заключалась в том, что я не могу понять, как программно развертывать MDB для разных сокетов, когда пользователь добавляет их.
Создайте ejb @ Singleton / @ Service, который управляет потоками демона с тщательной синхронизацией. Одноэлементный ejb может быть внедрен в бизнес-уровень, чтобы операции CRUD и манипуляции с сокетами происходили в правильном рабочем процессе. Проблема заключалась в том, что предполагаемое создание потоков из EJB-компонентов считается плохой практикой и не соответствует спецификации (даже если жизненный цикл синглтона правильно обрабатывается и имеются надлежащие механизмы синхронизации?).
Поместите потоки в модель предметной области (еще один синглтон?) И пусть EJB-компоненты используют эту модель. Это был худший из них, поскольку серверы приложений, как правило, имеют несколько загрузчиков классов, меньше поддержки контейнеров в целом, плюс это страдает от всего, от чего 2. страдает.
Есть идеи, как правильно справиться с этой ситуацией в Java EE?
РЕДАКТИРОВАТЬ: расширение этого вопроса: предполагая, что я решу подойти к этой проблеме, как предлагает Эвернли в своем решении 3, что я получу, сделав это в JCA (с настраиваемым интерфейсом для добавления внутренних потоков), чего я бы не получил от ( хорошо продуманный) синглтон? Хотя создание адаптера ресурсов не выглядит чудовищной задачей, это не кажется полностью тривиальным и может занять немного времени (а другим разработчикам, возможно, даже сложнее).