我使用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启动时启动而不是在每个启动的实例中启动
答案 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() {
//...
}
}