Надлежащее использование ServletContextListener в веб-приложении Java / Apache Tomcat - PullRequest
1 голос
/ 10 сентября 2009

Может кто-нибудь сказать мне, если это уместно использовать ServletContextListener для конкретного требования?

У меня есть веб-приложение, которое каждый час выполняет определенное задание для опроса ряда RSS-каналов, и в любой момент пользователь может определить новый RSS-канал для опроса.

Чего я хочу избежать, так это добавления пользователем фидов во время текущего ежечасного цикла опроса и включения этого фида (ов) в этот цикл.

Так что я думаю об использовании ServletContextListener со статической логической переменной, которая записывает, запущен цикл опроса или нет. Если выполняется почасовой цикл опроса, новый канал, определенный пользователем, не будет включен в этот цикл; если опрос не запущен, то подача может быть включена в следующий почасовой прогон.

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

Спасибо

Мартин О'Ши.

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Звучит как плохая идея. Почему бы просто не использовать ServletContext для вашего веб-приложения для хранения свойства веб-приложения ("polling-cycle-running")? Компонент в вашем веб-приложении, который запускает задание, устанавливает свойство в контексте; все заинтересованные компоненты (например, ваше действие AddRSS будут проверять это свойство в контексте как само собой разумеющееся.

servletCtx.setAttribute(POLLING_CYCLE_FLAG_ATTR, true);

и

if(!servletCtx.getAttribute((POLLING_CYCLE_FLAG_ATTR)) {
   // let the user add the feed ...
}

ServletContextListener посвящен жизненному циклу веб-приложения и изменениям ServletContext веб-приложения. Типичное использование для инициализации и очистки ресурсов для модулей для приложения. Но в принципе, если вам нужно следить за тем, что происходит в ServletContext, ServletContextListener ваш друг.

2 голосов
/ 10 сентября 2009

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

Если это по какой-то причине не относится к вашей проблеме, вы можете прочитать умения в коллекцию и работать с этим.

Или я полностью пропустил ваш вопрос?

0 голосов
/ 10 сентября 2009

Согласитесь с последним сообщением, что атрибуты ServletContext являются способом создания своего рода «глобальных переменных» в Servlet API.

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

Сервлеты получают доступ к объекту ServletContext через метод init (). ServletContextListeners также получают доступ через событие жизненного цикла contextInitialized (ServletContextEvent sce). Я думаю, что разумно, чтобы ваш класс опроса существовал как слушатель, который запускается и останавливается с жизненным циклом ServletContext, да И он будет иметь доступ к ServletContext при инициализации, да.

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