每月重新加载一次servlet

时间:2011-04-27 02:28:56

标签: java servlets websphere reload

如何每月重新加载一次servlet?

我们得到的一些数据会每月更改一次,数据是针对servlet的,但是我们不需要将数据保存到数据库中,而是我们希望将其作为一个配置文件,每月更换一次,我该怎么做?

我知道servlet的生命周期策略是由容器控制的,我使用的是websphere 7,但我不知道是否有办法在websphere中配置它。

调用destory()方法会影响servlet的运行实例吗? AFAIK,servlet是多线程的。

1 个答案:

答案 0 :(得分:6)

不要使用servlet来存储数据。而是将数据存储为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实例和一个每30天执行data.reload()的线程调度程序,您可以按如下方式访问每个servlet中的Data实例:

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

并在JSP中如下:

${data}