2016-11-28 3 views
-1

Я использую 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); 
} 

}

но хочет, чтобы запустить его где-то, где он будет начать при запуске приложения не в каждом случае, что обжигали до

+0

Просьба предоставить то, что вы пробовали до сих пор, то есть коды, чтобы мы могли помочь вам в дальнейшем. Спасибо. –

+0

Thx Keith. Я только что решил использовать событие pollListener в пользовательском интерфейсе, чтобы отключить события в интервале опроса. Кажется, работает нормально –

ответ

0

Поместите свой кода в доступном для всего мира месте, которое ваши компоненты пользовательского интерфейса могут регистрировать для получения событий тика

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() { 
     //... 
    } 
} 
Смежные вопросы