安排在24小时间隔
我想知道安排代码的最佳方法。 我有一个代码可以生成报告并以24小时的间隔向一组人发送邮件。 它是基于控制台的java应用程序。 我想知道安排它的最佳方法。 有时我可能需要将其更改为12小时间隔。 但是,应用程序不会在间隔之间执行任何其他任务。
以下是一些方法,从最简单到最全面:
-
sleep()
:TimeUnit.HOURS.sleep(24)
这种方法很简单,做工和睡24小时。 实际上它有点复杂,因为报告生成需要一些时间,所以你必须稍微睡一会儿。 以下所有解决方案都可以透明地处理
-
java.util.Timer#scheduleAtFixedRate()
– 简单的内置Java解决方案。 -
@Scheduled
注释在spring或@Schedule
在ejb中 – 更复杂但也更强大,例如接受cron表达式:@Scheduled(fixedRate=DateUtils.MILLIS_PER_DAY) public void generateReport() { //... }
-
quartz-scheduler – 完整的Java调度程序,具有集群和故障转移,失火处理,完整的cron支持等。非常全面:
newTrigger(). withSchedule( simpleSchedule(). withIntervalInHours(24). repeatForever() ).build();
要么
newTrigger(). withSchedule( cronSchedule(). dailyAtHourAndMinute(17, 30). //17:30 ).build();
我使用两种方式:
首先是非托管代码,如客户端代码: Chron4J
其次是JavaEE框架中的实现。 当您使用像Glassfish / JBoss这样的容器时,可以通过注释方法使用它。 会是这样的:
@Schedule(second="*/1", minute="*",hour="*", persistent=false) public void doWork(){ System.out.println("timer: " + helloService.sayHello()); }
如果我是你,我会看看石英调度员。 我在许多应用程序中使用它,它真的很容易使用。 您可以在此处找到更多信息: http : //quartz-scheduler.org/
如果您使用弹簧堆栈,我肯定会推荐它,因为它非常容易在xml中配置,让spring为您注入所有东西。
好吧,如果程序可以空闲,请尝试这样的事情
try { for (;;) { //code Thread.sleep(1000 * 60 * 60 * 24); //code } } catch(Exception e) { System.out.println(e); }