【问题标题】:reload servlet once a month每月重新加载一次 servlet
【发布时间】:2011-08-13 12:15:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java servlets websphere reload


    【解决方案1】:

    不要使用 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}
    

    【讨论】:

    • 我该如何实现这个?添加 2 个新课程?
    • 是的。并修改您的 Data 课程。只写代码。没有魔法。类名并不重要,它只是一个启动示例。你是程序员,不是我们。顺便说一句,Websphere 7 我相信还是在旧的 Servlet 2.5 版本上。您需要用/WEB-INF/web.xml 中的&lt;listener&gt; 条目替换@WebListener,我已经编辑了代码示例。但对于剩余部分,它应该可以正常工作。
    • 我很困惑,我应该在哪里调用这些新类?
    • 你不需要。 web.xml 中的 &lt;listener&gt; 条目将执行此操作。它将让 servletcontainer(在您的情况下为 Websphere)创建Config 的实例,它会在启动期间调用contextInitialized(),在关闭期间调用contextDestroyed()。请将鼠标放在我回答第一段蓝色ServletContextListener文字上方,然后按左键。阅读该文档以了解它的用途。对ScheduledExecutorService 执行相同操作。
    • 如果每个日历月都有新数据到达,则可能每天安排重新加载并检查月份中的哪一天会更可靠。 30 天的间隔将导致每年的重新加载日期发生变化,并且有时会在 1 月份重新加载两次,而在 2 月份则没有。
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 2016-01-19
    • 1970-01-01
    • 2020-10-24
    • 2021-11-13
    • 2016-05-07
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多