每月重新加载一次servlet

lam*_*988 2 java websphere servlets reload

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

我们得到的一些数据会每月更改一次,数据是针对servlet的,但是我们不需要将数据保存到DB中,而是我们想让它成为一个配置文件,每月更换一次,怎么能我这样做?

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

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

Bal*_*usC 6

不要使用servlet来存储数据.而是将数据存储为.的属性ServletContext.你可以借助a来做到这一点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();
    }

}
Run Code Online (Sandbox Code Playgroud)

(注意没有TimeUnit.MONTH,所以这是"每月一次"最好的)

这个Reloader类看起来像这样:

public class Reloader implements Runnable {

    private Data data;

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

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

}
Run Code Online (Sandbox Code Playgroud)

/WEB-INF/web.xml如下注册监听器之后

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

它将创建Data实例和一个data.reload()每30天执行一次的线程调度程序,您可以Data按如下方式访问每个servlet中的实例:

Data data = (Data) getServletContext().getAttribute("data");
Run Code Online (Sandbox Code Playgroud)

在JSP中如下:

${data}
Run Code Online (Sandbox Code Playgroud)

  • 是.并修改你的`Data`类.只需编写代码.没有魔力.这个类名并不重要,它只是一个启动的例子.你是程序员,而不是我们.顺便说一下,我相信Websphere 7仍然是旧的Servlet 2.5版本.你需要用`/ WEB-INF/web.xml`中的`<listener>`条目替换`@WebListener`,我编辑了代码示例.但对于残余它应该工作得很好. (2认同)
  • 你不需要.`web.xml`中的`<listener>`条目就可以了.它将让servletcontainer(在你的情况下是Websphere)创建一个`Config`的实例,它将在启动期间调用`contextInitialized()`并在关闭期间调用`contextDestroyed()`.请将鼠标放在我答案第一段中的蓝色"ServletContextListener"文本上方,然后按左键.阅读该文档以了解它的用途.为`ScheduledExecutorService`做同样的事情. (2认同)