У меня есть веб-приложение, которое загружает получатель событий из внешней системы при инициализации ServletContext. Все компоненты, которые должны получать события, прослушивают события атрибута ServletContext и присоединяются как слушатели. Поскольку я не хочу, чтобы прослушиватели событий пропускали события, я хочу запускать источник событий только после того, как все прослушиватели были подключены.
Я не смог найти какие-либо требования к потокам для инициализации в спецификации Servlet 2.5 и 3.0, поэтому я предполагал полностью асинхронную модель инициализации, но я заметил, что Tomcat запускает события изменения атрибута ServletContext непосредственно из метода setAttribute (). Это будет означать, что если все другие контейнеры сервлетов последуют их примеру, я могу упростить процедуру запуска.
РЕДАКТИРОВАТЬ: В соответствии с просьбой, вот пример (я пытался быть как можно более конкретным). В моем web.xml я в настоящее время зарегистрировался:
- BootstrapEventSourceContextListener при инициализации контекста сервлета:
- создает событие-источник и устанавливает его в качестве атрибута контекста сервлета.
- источник событий в данный момент не запускается (т.е. он не генерирует события)
- ConsumerAContextAttributeListener при получении уведомления о том, что установлен атрибут, содержащий источник события:
- ищет источник события из атрибута servlet-context
- создает экземпляр ConsumerA
- присоединяет ConsumerA к источнику событий
- устанавливает модель данных ConsumerA в качестве атрибута в контексте сервлета
- ConsumerBContextAttributeListener - так же, как Comsumer A
- ConsumerCContextAttributeListener - так же, как A и B, за исключением того, что он также зависит от модели данных B
- StartEventSourceFilter при доступе к странице:
- ищет источник событий из контекста сервлета
- запускает источник событий
- блоков до тех пор, пока источник событий не получит начальный снимок
- продолжает отображать страницу
Вопрос в том, действительно ли мне нужен StartEventSourceFilter, или он гарантированно присоединится ко всем потребителям, как только я установлю атрибут источника-события (т.е. прослушиватели атрибута не будут отложены). Я забочусь о Tomcat, Jetty и Websphere.