刷新/重新加载应用程序范围托管 bean

发布于 2024-10-16 00:47:33 字数 121 浏览 1 评论 0原文

我在刷新或重新加载应用程序范围的托管 bean 时遇到问题。它的行为就像缓存的数据bean。因此,一旦数据库端的数据发生更改,我想重新加载 bean 中的列表。 是否有办法刷新/重新加载列表,例如根据给定时间每天一次? 谢谢

I have a problem to refresh or reload an application scoped managed bean. It behaves as cached data bean. So once data is changed on db side, i want to reload the the list in the bean.
Is there anyway to refresh/reload the list, say once a day based on given time?
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月静好 2024-10-23 00:47:33

只需向应用程序作用域 bean 添加一个方法即可完成此操作。

public void reload() {
    list = dao.list();
}

然后将此 bean 抓取/注入到另一个 bean 中并调用该方法。

data.reload();

更新抱歉,我忽略了“每天一次”这一点。你的意思是后台自动重新加载?这最好通过由 ScheduledExecutorService。 ServletContextListener 如下:

@WebListener
public class Config implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        Reloader reloader = new Reloader(event.getServletContext());
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(reloader, 1, 1, TimeUnit.DAYS);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

创建一个 Reloader 看起来像这样(假设托管 bean 名称是 data

public class Reloader implements Runnable {

    private ServletContext context;

    public Reloader(ServletContext context) {
        this.context = context;
    }

    @Override
    public void run() {
        Data data = (Data) context.getAttribute("data");
        if (data != null) {
            data.reload();
        }
    }

}

Just add a method to the aplication scoped bean which does exactly that.

public void reload() {
    list = dao.list();
}

Then grab/inject this bean in another bean and call the method.

data.reload();

Update sorry, I overlooked the "once a day" bit. You mean automatic reloading in the background? This is best to be achieved by a background thread which is managed by ScheduledExecutorService. Create a ServletContextListener like follows:

@WebListener
public class Config implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        Reloader reloader = new Reloader(event.getServletContext());
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(reloader, 1, 1, TimeUnit.DAYS);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

Where the class Reloader look like this (assuming that the managed bean name is data)

public class Reloader implements Runnable {

    private ServletContext context;

    public Reloader(ServletContext context) {
        this.context = context;
    }

    @Override
    public void run() {
        Data data = (Data) context.getAttribute("data");
        if (data != null) {
            data.reload();
        }
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文