2011-12-28 41 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

相关问题