Как вы сказали, примеры, как правило, связаны с прямым вызовом. По моему опыту, это не только примеры. Ни одно из приложений Java EE * 1, которые я видел, не использует график долгоживущих объектов, как вы описали, вместо этого они обычно работают с одной записью (+ дочерние / связанные) в ответ на веб-запрос, вызов веб-службы или сообщение JMS. ,
Ваши требования нарушают то, что пресс-форма и Java EE могут не подходить наилучшим образом. По сути, тип кода, который вы описываете, принадлежит к EJB-контейнеру, но у этого контейнера отсутствует хороший долгоживущий контекст, к которому можно привязать граф объекта. Веб-контейнер имеет такой контекст, но не имеет средств для таймеров, обработки сообщений и тому подобного. Стоимость отказа от J2EE и использования простого Java-приложения, конечно же, приводит к потере возможностей сервера приложений для администрирования, развертывания и мониторинга.
Хорошим выбором может быть возвращение к тому, что сделало Spring Framework большим. Я не знаю, знакомы ли вы с историей J2EE, но внезапная огромная популярность Spring Framework и Hibernate по сути была восстанием сообщества против контейнера EJB, версии 1.x / 2.x. Spring WebApplicationContext дал вам надежный транзакционный сервер для веб-приложения, использующий преимущества MDB и JTA, в то же время игнорируя как можно большую часть EJB-контейнера * 2 (и значительно упрощая модульное тестирование в процессе). Вы можете воспользоваться этим подходом и создать свое приложение в виде единого файла WAR и загрузить свои фоновые службы с помощью Spring.
Интересной альтернативой является полное отключение сервера приложений Java EE и построение вашего приложения поверх платформы OSGi. Это подход «обычного Java-приложения», когда среда выполнения OSGi предоставляет вам консоль администрирования и функции горячего развертывания, которые вам пришлось бы использовать самостоятельно. Недостающие биты инфраструктуры - это таймер (используйте Quartz ) и управляемый сообщениями компонент (используйте напрямую JMS API). Приложение OSGi в конечном итоге немного напоминает ядро Linux и процесс загрузки, службы развертываются и запускаются в соответствии с уровнями выполнения. Возьмите Apache Felix и посмотрите.
Вы не упомянули масштаб. Если граф объектов огромный , обратите внимание на такие технологии, как GigaSpaces или Coherence.
** 1) Sun вычеркнула «2» из аббревиатуры с введением EJB3 *
** 2) Объектные EJB 2.x были худшей частью. EJB 3 можно рассматривать как в значительной степени «если вы не можете победить их, присоединяйтесь к ним» как попытку стандартизировать Hibernate. *