我正在使用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() {
//...
}
}