#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, где сервлеты могут получать их всякий раз, когда им это нужно? Таким образом, у вас есть полный контроль над данными; жизненный цикл сервлета больше не будет иметь значения.