每月重新加载一次servlet
如何每月重新加载一次servlet?
我们得到的一些数据会每月更改一次,数据是针对servlet的,但是我们不需要将数据保存到DB中,而是我们想让它成为一个配置文件,每月更换一次,怎么能我这样做?
我知道servlet的生命周期策略是由容器控制的,我使用的是websphere 7,但我不知道是否有办法在websphere中配置它。
调用destory()方法会影响servlet的运行实例吗? AFAIK,servlet是multithreading的。
不要使用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
注册侦听器后,如下所示
com.example.Config
它将创建Data
实例和每30天执行data.reload()
单线程调度程序,您可以按如下方式访问每个servlet中的Data
实例:
Data data = (Data) getServletContext().getAttribute("data");
在JSP中如下:
${data}