2015-03-03 72 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