2011-12-28 50 views
3

在EJB 3.0中TimerService.createTimer(initialDuration, intervalDuration, TimerID)方法只接受initialDurationintervalDuration參數。EJB 3.0 TimerService - 在每個月的第一天運行計時器

問題是我想在每個月的第一天運行計時器,並且我無法使用cron表達式來設置我的計時器,就像在EJB 3.1 TimerService中那樣。
某些解決方法就像是在每日基礎上運行,並在@Timeout方法中檢查日期,如果其'月的第一個月'但這不是合適的方法。

我在網上瀏覽了很多示例/教程,但沒有運氣。有沒有其他的方法來實現這種情況?

+1

我想你只是回答自己。每天運行並檢查日期是一個非常好的解決方法,它不需要任何費用。 – MaDa 2011-12-28 08:24:13

回答

3

我建議以下方法:

  • @Timeout方法使用JodaTime計算下一個點的時間。因此每個計時器都會在其@Timeout方法中安排下一次呼叫。這樣做的好處是,您可以建立一個管理對話框,提供系統中計劃的計時器的概述,如果您每天只運行一次計時器,則無法做到這一點。我使用它來實現一個相當複雜的,用戶可配置的計時器配置(Outlook風格,即類似於「每兩個月在上午9:00運行一次這樣的事情)」即使使用JodaTime,我也寫了很多代碼,但是,但是,你的情況不應該那麼複雜,基本上像

timerService.createTimer(new DateTime(System.currentTimeMillis()).plusMonths(1).withTimeAtStartOfDay().toDate(), null);

  • 放棄TimerService並直接使用Quartz安排計劃。然後你就可以直接飼餵的cron表達式進入API。Quartz通常與Java EE很好地集成,甚至在複雜的集羣環境。
2
try { 
     Scheduler scheduler; 
     scheduler = StdSchedulerFactory.getDefaultScheduler(); 
     scheduler.start(); 

     JobDetail job = new JobDetail("job name", "job group", (your class which will implement job interface).class); 
     CronTrigger trigger = new CronTrigger("trigger name", "trigger group", "0 0 0 1 * ?"); 
     scheduler.scheduleJob(job, trigger); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

使用上面的代碼將在每月1日運行定時器。

+1

您忘記提及您的代碼段使用Quartz還是假設每個人都會立即從類名稱中識別出來? – 2011-12-28 17:04:04

+0

對不起,我的錯誤。是的,我正在使用Quartz。 – 2011-12-29 08:40:16

相關問題