在EJB 3.0 TimerService.createTimer(initialDuration, intervalDuration, TimerID)
方法中,只接受initialDuration
和intervalDuration
个参数。
问题是我想在每个月的第1天运行计时器,我不能像在EJB 3.1 TimerService
中那样使用cron表达式设置我的计时器。
一些解决方法就像在每日基础上运行并检查@Timeout
方法中的日期,如果它是'月的第一个',但这是不合适的方式。
我在线浏览了许多示例/教程,但没有运气。有没有其他方法可以实现这种情况?
答案 0 :(得分:3)
我建议采用以下方法:
@Timeout
方法中,使用JodaTime计算下一个时间点。因此,每个计时器都会使用@Timeout
方法调度下一个调用。这样做的好处是,您可以构建一个管理对话框,该对话框提供系统中预定计时器的概述,如果您每天只运行计时器,则无法执行此操作。我使用它来实现一个相当复杂的,用户可配置的计时器配置(Outlook样式,即“在上午9:00在第三个每两个月运行一次)。即使使用JodaTime,我最终编写了大量代码,但是,在你的情况下它不应该那么复杂。基本上就像
timerService.createTimer( new DateTime( System.currentTimeMillis()).plusMonths(1).withTimeAtStartOfDay().toDate(), null );
答案 1 :(得分: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天运行计时器。