Зачем использовать объект ServletContext в веб-приложении, содержащем сервлеты и «рабочие» потоки в Java - PullRequest
1 голос
/ 05 октября 2009

В настоящее время у меня есть веб-приложение, в котором у меня есть сервлеты, которые читают и записывают атрибуты ServletContext, и у меня есть «рабочие» потоки (потоки Daemon), которые инициализируются при запуске и в настоящее время содержат в качестве члена объект ServletContext , По нескольким причинам я подумываю перейти к «внедрению Runnable» вместо этого, и я как бы застрял с тем фактом, что мне нужен общий ресурс, который сервлеты и не сервлеты могут использовать для общения друг с другом, и я чувствую, что я немного застрял во всей парадигме ServletContext. Я был бы признателен, если бы кто-то мог указать, зачем использовать ServletContext (по-моему, иначе), а также я думаю просто использовать одноэлементный класс, который будет инициализирован при запуске и будет поточно-ориентированным, и я Буду просто маршрутизировать все коммуникации сервлетов и не сервлетов через него. Что ты думаешь?

Спасибо

1 Ответ

7 голосов
/ 05 октября 2009

Контейнер Java Servlet - это контейнер кода с легким управлением. Сервлеты - это компоненты с очень четко определенным жизненным циклом, и между контейнером и компонентами также имеется очень четко определенный контракт (который также может включать фильтры).

Как указано, веб-приложение является пассивно-реактивной системой.

Это пассивно в том смысле, что пользовательские потоки (строго) не допускаются. (Некоторые контейнеры могут не применять это ограничение, но, порождая свои собственные потоки, вы фактически отключаетесь от резервирования, и могут возникнуть непредсказуемые действия.)

Он реагирует в том смысле, что активность на сервере (в вашей кодовой базе) происходит в ответ на запросы, и это относится к типичным HTTP-запросам приложения Servlet.

ServletContext - это общий контекст всех компонентов данного веб-приложения в контейнере. Этот контекст создается при активации веб-приложения и уничтожается при его деактивации. Вы можете использовать компонент ServletContextListener, чтобы подключиться к этому жизненному циклу и получить обратные вызовы уведомлений о событиях жизненного цикла.

Если вы хотите продолжить с дикой стороны и порождать активные элементы в своем веб-приложении, вы можете рассмотреть следующие вопросы:

1 - Создание и регистрация компонента ServletContextListner для управления активными компонентами. При запуске / активации веб-приложения вы получите обратный вызов из контейнера. Здесь вы можете запустить свои резьбовые компоненты. Поскольку этому компоненту будет передана ссылка на ServletContext, вы можете передать эту ссылку многопоточным компонентам.

2 - Ваш класс многопоточных компонентов (будь то расширение Thread или реализация Runnable) должен быть управляемым, в том смысле, что вам нужно предоставить средства для чистого отключения потока, когда ваш ServletContextListener получает обратный вызов отключения контекста. Если вы готовы формализовать выполняемые задачи, ExecutorService предоставляет необходимую вам функциональность, поэтому вам не нужно заново изобретать колесо.

Тем не менее, вы можете рассмотреть ваши требования и, следовательно, выбранный вами дизайн и веб-контейнерную платформу. Возможно, вам действительно нужен более сложный внутренний стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...