首页 > 解决方案 > 在服务器端自动刷新 ApplicationScoped Bean

问题描述

我想在 1h 自动调用 init() 方法后刷新一个 ApplicationScoped Bean。

从客户端,我可以创建一个按钮来更新 bean,但我希望每隔特定小时自动重新加载它,而无需单击或等待页面(因此没有 Ajax 回调)。

此外,我阅读了这篇文章: 刷新/重新加载应用程序范围托管 bean ,但我想避免管理线程等。

是否可以在不更改 bean 的范围的情况下实现?

谢谢

标签: javajsf-2javabeans

解决方案


我解决了以这种方式实施:

1) 添加 Runnable 实现

@ManagedBean(eager= true, name="dashboardbean")
@ApplicationScoped
public class DashboardBean implements Serializable, Runnable {

2)添加实现方法“run”

@Override
public void run() {
    System.out.println("##########populateData#############");
    allServerCount = numbersServer.get("serverCount");
    System.out.println("###########server "+allServerCount+"#############");
    System.out.println("###########end populateData#############");
}

3)实现了bean的init方法

@PostConstruct
public void init() {
    System.out.println("##########init#############");
    scheduler = Executors.newSingleThreadScheduledExecutor();
    scheduler.scheduleAtFixedRate(this, 0, 2, TimeUnit.MINUTES);
    System.out.println("##########end#############");
}

4) 添加销毁调度器的部分

private ScheduledExecutorService scheduler; 

@PreDestroy
public void destroy() {
    scheduler.shutdownNow();
}

这是日志上每 2 分钟生成的输出

##########populateData#############
###########server 339#############
###########end populateData#############
##########populateData#############
###########server 340#############
###########end populateData#############
##########populateData#############
###########server 340#############
###########end populateData#############

推荐阅读