2012-03-08 117 views
2

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

+0

你使用什么系统? – kaupov 2012-03-08 13:02:36

+0

应该是系统独立的。可能是Linux或Windows。 – 2012-03-08 13:03:10

回答

5

这里有一些方法,从最简单到最全面:

  1. sleep()

    TimeUnit.HOURS.sleep(24) 
    

    这种做法很简单,做的工作和睡眠24小时。事实上,这样会更复杂一些,因为报告需要一些时间,所以你不得不稍微休息一下。以下所有解决方案都透明地处

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

  3. @Scheduled@Schedule的注释 - 更复杂但更强大,例如,接受表达式:

    @Scheduled(fixedRate=DateUtils.MILLIS_PER_DAY) 
    public void generateReport() { 
        //... 
    } 
    
  4. - 全面成熟的Java调度与集群和故障转移,失火的处理,充分支持等非常全面的:

    newTrigger(). 
        withSchedule(
        simpleSchedule(). 
         withIntervalInHours(24). 
         repeatForever() 
        ).build(); 
    

    newTrigger(). 
        withSchedule(
        cronSchedule(). 
         dailyAtHourAndMinute(17, 30). //17:30 
        ).build(); 
    
0

我使用的方法有两种:

首先对于像客户端代码的非托管代码: Chron4J

二是在JavaEE的framewoks implmented。当您使用像Glassfish/JBoss这样的容器时,您可以通过注释方法使用它。会是这样的:

@Schedule(second="*/1", minute="*",hour="*", persistent=false) 
public void doWork(){ 
    System.out.println("timer: " + helloService.sayHello()); 
} 
0

我会看看石英调度器,如果我是你。 我在很多应用程序中使用,它非常易于使用。 你可以在这里找到更多的信息:http://quartz-scheduler.org/

如果您使用的弹簧组我肯定会推荐它,因为它是超级容易用XML配置,让春天注入所有的东西给你。

0

那么,如果程序可以idl Ë尝试这样的事情

try 
{ 
for (;;) { 
    //code 
    Thread.sleep(1000 * 60 * 60 * 24); 
    //code 
    } 
} 
catch(Exception e) 
{ 
    System.out.println(e); 
}