如何每月重新加载一次servlet?
我们得到的一些数据会每月更改一次,数据是针对servlet的,但是我们不需要将数据保存到数据库中,而是我们希望将其作为一个配置文件,每月更换一次,我该怎么做?
我知道servlet的生命周期策略是由容器控制的,我使用的是websphere 7,但我不知道是否有办法在websphere中配置它。
调用destory()方法会影响servlet的运行实例吗? AFAIK,servlet是多线程的。
答案 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}