перезагружать сервлет раз в месяц - PullRequest
2 голосов
/ 27 апреля 2011

Как можно перезагрузить сервлет один раз в месяц?

У нас есть некоторые данные, которые будут меняться раз в месяц, данные для сервлета, но нам не нужно сохранять данные в БД,вместо этого мы хотим сделать его конфигурационным файлом, который будет заменяться раз в месяц, как я могу это сделать?

Я знаю, что политика жизненного цикла сервлета контролируется контейнером, я использую websphere 7, но яне знаете, есть ли способ настроить это в websphere.

Повлияет ли вызов метода destory () на работающие экземпляры сервлета?AFAIK, сервлет многопоточный.

1 Ответ

6 голосов
/ 27 апреля 2011

Не используйте сервлет для хранения данных.Скорее сохраните данные как атрибут ServletContext.Вы можете сделать это с помощью ServletContextListener.Тот же самый класс слушателя может также использоваться для перезагрузки данных через определенные интервалы времени с помощью ScheduledExecutorService.

Вот пример запуска:

public class Config implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        Data data = new Data();
        event.getServletContext().setAttribute("data", data);
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new Reloader(data), 0, 30, TimeUnit.DAYS);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

(обратите внимание, что TimeUnit.MONTH нет, так что это лучшее, что вы можете получить "раз в месяц")

Где класс Reloader выглядит следующим образом:

public class Reloader implements Runnable {

    private Data data;

    public Reloader(Data data) {
        this.data = data;
    }

    @Override
    public void run() {
        data.reload();
    }

}

После регистрации прослушивателя в /WEB-INF/web.xml следующим образом

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

он создаст экземпляр Data и однопоточный планировщик, который выполняет data.reload() каждые 30 дней, и вы можете получить доступ кData экземпляр в каждом сервлете выглядит следующим образом:

Data data = (Data) getServletContext().getAttribute("data");

и в JSP следующим образом:

${data}
...