站点广泛的计时器



我正在使用vaadin作为我们应用程序的框架。我想在服务器上实现一个计时器,该计时器会定期启动事件,但我希望它是一个系统范围的轮询线程,以便在服务器上只有一个在服务器上运行,并且所有UI在需要时使用该计时器。我意识到,如果它在UI中,那么每个UI实例都会创建一个新线程。所以我不确定要把它放在哪里。在延伸Vaadin Servlet的类中,就像在servletInitialized方法中一样?如果是这样,则不确定如何将活动从那里列入可以使用的课程。

想要做这样的事情

    TimerTask tt = new TimerTask() {
        @Override
        public void run() {
            try 
            {
                System.out.println("fired event");
                //get the event out of here to somewhere in the code that can use it
            } 
            catch (Exception ex) 
            {
                System.out.println(ex.toString());
            }
        }
    };
    Timer t = new Timer(true);
    t.scheduleAtFixedRate(tt, 0, 10000);
}

}

,但是想在应用程序启动时不在每个实例中启动的

启动的地方运行它。

将您的代码放在UI组件可以注册以接收tick事件

的全球访问位置
interface GlobalTimerListener {
    void onTick();
}
class GlobalTimer {
    private static List<GlobalTimerListener> listeners = new ArrayList<>();
    public static void register(GlobalTimerListener gtl) {
        listeners.add(gtl);
    }
    static {
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                try
                {
                    System.out.println("fired event");
                    //get the event out of here to somewhere in the code that can use it
                    for (GlobalTimerListener listener : listeners) {
                        listener.onTick();
                    }
                }
                catch (Exception ex)
                {
                    System.out.println(ex.toString());
                }
            }
        };
        Timer t = new Timer(true);
        t.scheduleAtFixedRate(tt, 0, 10000);
    }
}

然后,在您的UI中,您可以通过注册以接收事件来采取行动。每当执行计时器任务时,将调用OnTick方法。

class ElseWhereInTheUI {
    public ElseWhereInTheUI() {
        GlobalTimer.register(new GlobalTimerListener() {
            @Override
            public void onTick() {
                doTheThingThatHappensOnTick();
            }
        });
    }
    private void doTheThingThatHappensOnTick() {
        //...
    }
}

最新更新