定时任务全系列总结有哪些?

摘要:前言 在不用的业务场景下要用不同的定时任务,其实我们的选择还是挺多的。本文总结了 10 种非常实用的定时任务,总有一种是适合你的。 一. linux 自带的定时任务 crontab 不知道你有没有遇到过这种场景:有时需要临时统计线上的数据,
前言 在不用的业务场景下要用不同的定时任务,其实我们的选择还是挺多的。本文总结了 10 种非常实用的定时任务,总有一种是适合你的。 一. linux 自带的定时任务 crontab 不知道你有没有遇到过这种场景:有时需要临时统计线上的数据,然后导出到 excel 表格中。这种需求有时较为复杂,光靠写 sql 语句是无法满足需求的,这就需要写 java 代码了。然后将该程序打成一个 jar 包,在线上环境执行,最后将生成的 excel 文件下载到本地。 为了减小对线上环境的影响,我们一般会选择在凌晨 1-2 点,趁用户量少的时候,执行统计程序。(其实凌晨 4 点左右,用户才是最少的) 由于时间太晚了,我们完全没必要守在那里等执行结果,一个定时任务就可以搞定。 那么,这种情况用哪种定时任务更合适呢? 答案是:linux系统的crontab。(不过也不排除有些项目没部署在 linux 系统中) 运行crontab -e,可以编辑定时器,然后加入如下命令: 0 2 * * * /usr/local/java/jdk1.8/bin/java -jar /data/app/tool.jar > /logs/tool.log & 就可以在每天凌晨 2 点,定时执行tool.jar程序,并且把日志输出到tool.log文件中。当然你也可以把后面的执行 java 程序的命令写成 shell 脚本,更方便维护。 使用这种定时任务支持方便修改定时规则,有界面可以统一管理配置的各种定时脚本。 crontab 命令的基本格式如下: crontab [参数] [文件名] 如果没有指定文件名,则接收键盘上输入的命令,并将它载入到crontab。 参数功能对照表如下: 参数功能 -u 指定用户 -e 编辑某个用户的crontab文件内容 -l 显示某个用户的crontab文件内容 -r 删除某用户的crontab文件 -i 删除某用户的crontab文件时需确认 以上参数,如果没有使用-u指定用户,则默认使用的当前用户。 通过crontab -e命令编辑文件内容,具体语法如下: [分] [小时] [日期] [月] [星期] 具体任务 其中: 分,表示多少分钟,范围:0-59。 小时,表示多少小时,范围:0-23。 日期,表示具体在哪一天,范围:1-31。 月,表示多少月,范围:1-12。 星期,表示多少周,范围:0-7,0 和 7 都代表星期日。 还有一些特殊字符,比如: *代表如何时间,比如:*1***表示每天凌晨 1 点执行。 /代表每隔多久执行一次,比如:*/5 ****表示每隔 5 分钟执行一次。 ,代表支持多个,比如:10 7,9,12 ***表示在每天的 7、9、12 点 10 分各执行一次。 -代表支持一个范围,比如:10 7-9 ***表示在每天的 7、8、9 点 10 分各执行一次。 此外,顺便说一下crontab需要crond服务支持,crond是linux下用来周期地执行某种任务的一个守护进程,在安装linux操作系统后,默认会安装crond服务工具,且crond服务默认就是自启动的。crond进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务。 可以通过以下命令操作相关服务: service crond status // 查看运行状态 service crond start //启动服务 service crond stop //关闭服务 service crond restart //重启服务 service crond reload //重新载入配置 使用crontab的优缺点: 优点:方便修改定时规则,支持一些较复杂的定时规则,通过文件可以统一管理配置好的各种定时脚本。 缺点:如果定时任务非常多,不太好找,而且必须要求操作系统是linux,否则无法执行。 二. jdk 自带的定时任务 1.Thread 各位亲爱的朋友,你没看错,Thread类真的能做定时任务。如果你看过一些定时任务框架的源码,你最后会发现,它们的底层也会使用Thread类。
阅读全文