Контроль того, когда сервлеты умирают

#java #servlets #websphere

#java #сервлеты #websphere

Вопрос:

У меня есть некоторая конфигурация, сохраненная в контексте сервлета, совместно используемая сервлетами. Текущий подход заключается в загрузке конфигурации в единственную копию статической хэш-карты, совместно используемой сервлетами при вызове метода init() любого сервлета. Но проблема в том, что сервлеты просто не умрут, поэтому конфигурация просто не сбросится, даже если я изменил конфигурацию в контексте сервлета. Поскольку сервлет больше никогда не вызывает init (), они не будут перезагружать конфигурацию в hashmap.

Я использую websphere 7, есть ли какое-либо место, где я могу настроить, когда сервлет умирает и рождается новый сервлет?

Я думаю, что слишком неуклюже перезагружать конфигурацию из контекста сервлета при поступлении нового запроса.


Редактировать: У меня есть планировщик, который создаст новый поток для проверки наличия определенного файла данных, если файл данных был новым, он создаст hashmap (с содержимым файла данных) в качестве атрибута в контексте сервлета.

Теперь сервлеты проверят контекст сервлета для хэш-карты и скопируют его в статическую хэш-карту для совместного использования сервлетами, когда они только что созданы, и вызовут init() . Но проблема в том, что сервлет не умрет во время выполнения, это просто приведет к тому, что запланированное действие не сработает.

Комментарии:

1. Не могли бы вы более конкретно рассказать о том, что вы пытаетесь изменить в своем контексте? Какое действие вызывает это изменение?

2. Хорошо, подождите минутку, пожалуйста, вернитесь к вопросу позже.

3. Зачем иметь статическую карту для «общего использования сервлетами» — почему бы просто не использовать ServletContext ? На самом деле это скорее «контекст приложения», поскольку он доступен во всем вашем приложении.

4. Я хочу иметь его копию, чтобы ему не нужно было получать атрибут контекста сервлета из контекста сервлета каждый раз, когда он используется.

Ответ №1:

Я использую websphere 7, есть ли какое-либо место, где я могу настроить, когда сервлет умирает и рождается новый сервлет?

Нет.

Редактировать: У меня есть планировщик, который создаст новый поток для проверки наличия определенного файла данных, если файл данных был новым, он создаст hashmap (с содержимым файла данных) в качестве атрибута в контексте сервлета.

Теперь сервлеты проверят контекст сервлета для хэш-карты и скопируют его в статическую хэш-карту для совместного использования сервлетами, когда они только что созданы, и вызовут init() . Но проблема в том, что сервлет не умрет во время выполнения, это просто приведет к тому, что запланированное действие не сработает.

Преобразуйте настройки в отдельный объект данных (а не в HashMap или поля экземпляра сервлета), который будет использоваться экземплярами сервлета совместно. Измените планировщик / аварийный сигнал, чтобы напрямую обновлять общий объект данных.

Ответ №2:

Почему бы не сохранить эти данные в JNDI, где сервлеты могут получать их всякий раз, когда им это нужно? Таким образом, у вас есть полный контроль над данными; жизненный цикл сервлета больше не будет иметь значения.