2015-03-03 92 views
0

我有一個任務,我想在每個星期日的下午6點運行,並且我爲此使用了javax.ejb.Schedule。我把時間表設爲;Java日程只運行一次

@Schedule(dayOfWeek = "Sun", hour="18", persistent = false) 

由於某種原因,這隻能運行一次,然後悄然停止。如果我註釋它如下,它會繼續前進並且每分鐘運行一次;

@Schedule(hour="*", minute="*", persistent = false) 

我知道,如果一個異常被拋出定時器被清除,但是當我運行它每分鐘能正常工作。此外,第一個星期天它運行良好,然後我看不到第二個星期天的痕跡;沒有例外或日誌或任何東西。 有什麼想法?更多的代碼;

@Schedules(value = { 
     @Schedule(dayOfWeek = "Sun", hour="18", persistent = false) 
     }) 
public void runTask() { 

    logger.info("Running task"); 
    File file = new File("file.csv"); 
    List<String[]> data = getData(); 
    try { 
     populateCsv(file, data); 
    } catch (IOException e) { 
     logger.error("Error creating csv file", e); 
    } 
} 

private void populateCsv(File file, List<String[]> data) throws IOException { 
    CSVWriter csvWriter = null; 
    try { 
     FileWriter fileWriter = new FileWriter(file); 
     csvWriter = new CSVWriter(fileWriter, ',', CSVWriter.NO_QUOTE_CHARACTER); 
     csvWriter.writeAll(data); 
    } finally { 
     if (csvWriter != null) { 
      csvWriter.close(); 
     } 
    } 
} 

的@Schedules註釋是有歷史原因,只是想保持代碼的準確位置張貼

+1

您是否嘗試過調試以查看究竟發生了什麼?如果你在你的方法中放置一個斷點,你可以運行堆棧來查看哪個Java類正在調用你的方法,以及它爲什麼可能重新調度。 – 2015-03-03 12:53:44

+0

我的猜測將在那裏你設置爲'永久性'爲假,嘗試將其設置爲true並再次運行 – user902383 2015-03-03 13:27:11

+0

問題是,如果我想調試我把它設置爲星期二(如今天星期二),它將工作一次沒有問題,沒有例外拋出。然後Id必須等待一個星期...... 如果我將它設置爲dayOfWeek =「Tue」,小時=「*」,分鐘=「*」可以多次調試,它可以整天工作。我認爲它的默認設置,如設置分鐘=「*」會給你每分鐘的小時默認午夜 – Hanna 2015-03-03 13:29:50

回答

0

先給請將dayOfMonth =「太陽報」,一個月的時候=「」,一年=「」 ,小時=「18」作爲參數並驗證。

+0

我試試這個,我認爲它可能與默認值有關,儘管我無法找到任何信息默認值 – Hanna 2015-03-03 13:31:10

+0

上週我部署了一個這樣的版本,它根本沒有運行; @Schedule(year =「*」,month =「*」,dayOfWeek =「Sun」,hour =「18」,persistent = false) – Hanna 2015-03-09 09:37:30

+0

請刪除這些月份和年份屬性,而不是dayOfWeek..use dayOfMonth並嘗試我認爲它會起作用:/ – 2015-03-10 09:28:44