站点范围计时器

时间:2016-11-28 03:27:25

标签: java vaadin

我使用vaadin作为我们应用程序的框架。我想在服务器上实现一个定时触发事件的计时器,但我希望它是一个系统范围的轮询线程,这样服务器上只运行一个计时器和所有UI' s如果需要,使用该计时器。我意识到如果它在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);
}

}

但是想在某个地方运行它,它会在app启动时启动而不是在每个启动的实例中启动

1 个答案:

答案 0 :(得分:0)

将您的代码放在一个全局可访问的位置,您的UI组件可以注册该位置以接收节拍事件

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);
    }
}

然后,在您的用户界面中,您可以通过注册接收它们来对事件采取行动。只要执行计时器任务,就会调用onTick方法。

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