2017-05-17 115 views
0

我想要一個進程在我啓動web服務之後運行,然後每隔30分鐘左右(我現在用一個較小的延遲測試它,看看它是否工作),但我的流程從未運行過一次以上。我究竟做錯了什麼?ScheduledExecutorService只運行一次

這裏是我的代碼:

@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

你確定run()方法返回嗎? – Warrior

回答

4

run代碼try catch

只是一個猜測:一個異常被拋出。如果遇到異常,A ScheduledExecutorService將自動暫停。

run方法的代碼應該總是被try-catch包圍以處理和吸收拋出的異常。

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

存根run方法

採取小步。從run方法開始,除了System.out.println之外什麼也不做。

+0

當我將它更改爲打印語句時,它會執行多次,因此至少現在我知道問題不在調度代碼中了! – MMAdams