安排在24小时间隔

我想知道安排代码的最佳方法。 我有一个代码可以生成报告并以24小时的间隔向一组人发送邮件。 它是基于控制台的java应用程序。 我想知道安排它的最佳方法。 有时我可能需要将其更改为12小时间隔。 但是,应用程序不会在间隔之间执行任何其他任务。

以下是一些方法,从最简单到最全面:

  1. sleep()

     TimeUnit.HOURS.sleep(24) 

    这种方法很简单,做工和睡24小时。 实际上它有点复杂,因为报告生成需要一些时间,所以你必须稍微睡一会儿。 以下所有解决方案都可以透明地处理

  2. java.util.Timer#scheduleAtFixedRate() – 简单的内置Java解决方案。

  3. @Scheduled注释在spring或@Schedule在ejb中 – 更复杂但也更强大,例如接受cron表达式:

     @Scheduled(fixedRate=DateUtils.MILLIS_PER_DAY) public void generateReport() { //... } 
  4. 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); }