2017-05-17 8 views
0

Ich möchte einen Prozess ausführen, nachdem ich meinen Webservice gestartet habe, und dann alle 30 Minuten oder später (Ich teste es mit einer kleineren Verzögerung, nur um zu sehen, ob es funktioniert), aber Mein Prozess läuft nie mehr als einmal. Was mache ich falsch?ScheduledExecutorService wird nur einmal ausgeführt

Hier ist mein Code:

@WebListener 
public class SchedulerService implements ServletContextListener{ 

    @Autowired 
    UpdateSubscriberService updateSubscriberService; 

    ScheduledExecutorService scheduledExecService; 

    public SchedulerService(){ 
     scheduledExecService = Executors.newSingleThreadScheduledExecutor(); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 
     scheduledExecService.shutdown(); 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     scheduledExecService.scheduleWithFixedDelay(new Runnable(){ 
      @Override 
      public void run() { 
       Date date = new Date(System.currentTimeMillis()); 
       System.out.println("Running scheduled update check " + date.toString()); 
       updateSubscriberService.checkForUpdates(); 
      } 
     }, 60, 30, TimeUnit.SECONDS); 
    } 
} 
+1

Sind Sie sicher, dass die run() -Methode zurückgibt? – Warrior

Antwort

4

Wrap run Code mit try catch

nur eine Vermutung: eine Ausnahme ausgelöst wird. A ScheduledExecutorService stoppt automatisch, wenn eine Ausnahme auftritt.

Der Code der Methode run sollte immer von einem try-catch umgeben sein, um jede ausgelöste Exception zu behandeln und zu absorbieren.

@Override 
public void run() { 
    try { // Let no Exception reach the ScheduledExecutorService. 
     Date date = new Date(System.currentTimeMillis()); 
     System.out.println("Running scheduled update check " + date.toString()); 
     updateSubscriberService.checkForUpdates(); 
    } catch (Exception e) { 
     System.out.println("ERROR - unexpected exception"); 
    } 
} 

Stub aus run Methode

Nehmen Sie Baby-Schritte. Beginnen Sie mit einer run Methode, die nur eine System.out.println tut.

+0

Wenn ich es nur zu einer Druckanweisung änderte, wurde es mehrmals ausgeführt, so wie es sollte, so weiß ich zumindest jetzt, dass das Problem nicht im Zeitplancode ist! – MMAdams

Verwandte Themen