首页 > 如何编写循环定期执行的任务?

如何编写循环定期执行的任务?

需求是设计一个系统,某一个组件需要定期对数据进行批处理计算,比如每隔2个小时执行一次计算。
应该怎么实现呢?在主程序中写个循环还是设定一个crontab任务由系统间隔性执行程序?


这个定时调用最好与系统的模块独立,也就是大家推荐用crontab去调用,定时任务做的事情越复杂越应该如此。

但是有些特定情况,需要在程序内做一些轻量级的定时任务,比如刷新一个数据缓存,这样可以考虑quartz模块,也是用cron表达式做定时任务,spring有个封装,用起来非常方便。


晚上考虑了一下。其实并不是说一定要用某种方式,而是要根据实际需求出发来选择最终的方案。crontab是好,但在某些场合不一定适合;主程序中添加定时任务并不一定都是坏的,有时候还真要这么选择。

分离 or 耦合

个人经验,绝大部分的定时任务都可以从主应用中分离,比如说统计数据计算、过期数据清理、数据备份、日志监控等等。但是前提是定时任务与主业务逻辑关联不大。如果定时任务和主业务耦合,比如说积分计算,计算规则比较复杂,而且可能随需求变动,若从主业务代码分离,那么规则变动的时候就需要改两份代码,好一点这部分规则做了封装,那么改动之后还要记得主业务和定时流程都要重新部署。

如果不用crontab或者类crontab组件,那么也用忙等去做定时任务也是不可取的。可以使用ScheduledExecutorService管理延时任务。

同意@公子的。但是用crontab的时候需要注意执行线程能够正常退出。之前就发生过因为执行线程没有退出,资源占满。

如果任务执行依赖的组件比较多,在主业务中编写方便的话,也可以考虑使用定时器来作延时任务管理。


推荐用 crontab ,感觉死循环常驻内存这种事情怎么看怎么感觉很危险…而且 crontab 配置简单,不用写多余的代码,专注要做的事情。


在linux上显然使用crontab要好,这里还有一个php crontab管理,可以参考下。


  1. 计划任务(windows os)\crontab(*unix)
  2. 子线程timer
  3. 数据库存储过程+job
【热门文章】
【热门文章】