所以今天我脑子里有了一个想法...而且我想听一些反馈。我有一个Java应用程序,需要每5分钟检查一个目录。简单而简单的应用程序需要每五分钟运行一次。
似乎是cronjob的一个很好的候选者,但我想知道......为什么不保持逻辑/时间在应用程序中如此(显然简化):
public static void main(String[] args) {
while(true) { // repeatedly execute...
// do the work/job
Thread.sleep(600 * 1000); // make the thread sleep for 5 minutes
}
}
我看到的一个重要缺点是"一旦它启动,我们如何停止这个应用程序?删除它?
除了那个之外还有其他重要的缺点吗?
我应该停止做白日梦而只是使用cron工作吗?
答案 0 :(得分:5)
许多重大缺点:
我把这个节目称为“捕捉程序”,因为它的行为就像一只猫:它大部分时间都在睡觉,现在醒来然后伸展,也许可以用一根绳子敲打几分钟,然后再回到睡觉。 Programs are not cats
答案 1 :(得分:2)
您可以使用ScheduledExecutorService
以固定费率运行任务,并在某些操作上停止此操作(此处阅读System.in
):
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// do some work
}
}, 0, 5, TimeUnit.MINUTES); // every 5 minutes
// when anything is entered, the task is stopped
Scanner sc = new Scanner(System.in);
String whatever = sc.next();
// shutdown the executor
ses.shutdown();
ses.awaitTermination(15, TimeUnit.SECONDS);
}
答案 2 :(得分:2)
像所建议的那样的解决方案的优点是它可以在没有cron
的操作系统上工作(但每个操作系统都有某种调度程序)。
另一方面,使用cron
具有以下优势:
任务将在下一个预定时间运行,即使它崩溃了;显示的解决方案在崩溃后不会再次运行,直到有人重新启动它。
Cron将在重启后重新开始运行任务;提出的解决方案并没有这样做。
当任务停止然后定期关闭时,内存泄漏不如长时间运行过程那么重要。
通过列举随着时间推移已添加到OS级别作业调度程序的更多功能,无疑可以延长此列表。
答案 3 :(得分:0)
我会在我的应用程序中使用石英调度程序。链接http://quartz-scheduler.org/
它确实可以控制,当你启动应用程序时它会运行,当你的应用程序停止时它会停止。虽然有更多的设置,但它非常灵活。