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