定时任务经常挂怎么办

2015-12-04 20:04:13 +08:00
 HypoChen

最近写了一个 TODO ,正准备作为学期末 Java 的大作业,但不想以作业的要求写东西,便打算提高下实用性自给自足改善下生活习惯_(:з」∠)_。

所以,作为一个合格的 TODO ,应该有一个事件提醒功能,经搜索我就发现 Java 里有个 timertask ,可以作为定时任务,便用这个写了一个每天 6 点检查所有事件并发邮件提醒。

不过 timertask 好像十分不靠谱,经常没有反应了,因为并不知道这个东西到底有没有在跑,所以便到了 6 点执行完事件检查后给我发封邮件,如果没有发送邮件的话我会去重启下程序

http://ww3.sinaimg.cn/mw690/6ad13735jw1eygqpssoetj20u01hcwrn.jpg

每天重启 3 天后我决定弃坑,改用了 quartz ,这个广受好评的开源计时器,然后我第二天 6 点果然收到了事件检查完成的提示邮件,灰常高兴,以为从此离坑走上正轨。

不过两天后,邮件又没了,然后我只好去重启服务器,第二天,还是没有邮件,知道现在,毛音信都没有,都无力吐槽了。

我现在实在很疑惑,到底什么算是计时器的正确使用姿势,计时器经常挂咋办?

4960 次点击
所在节点    Java
28 条回复
TangMonk
2015-12-04 20:05:44 +08:00
crontab 不行吗
skydiver
2015-12-04 20:06:53 +08:00
@TangMonk 233333
skydiver
2015-12-04 20:07:36 +08:00
@TangMonk 因为 Java 程序员眼里 Java 是万能的,不需要别的东西
letitbesqzr
2015-12-04 20:10:51 +08:00
公司的 quartz 服务 跑了大半年了...都没遇到过问题... 你都定时处理什么任务了?
odirus
2015-12-04 20:12:56 +08:00
你看一下你的程序为啥异常退出哇。 crontab 非常不错,而且日志也很详细,没必要重复发明轮子。
HentaiMew
2015-12-04 20:14:01 +08:00
你至少要能确定它是执行了但是中途失败了,还是没执行... 还有定时的表达式是什么,贴出来看看
HypoChen
2015-12-04 20:14:23 +08:00
@TangMonk 额,还真没考虑到用系统的命令来作为计时器,不过像这种情况,在实际开发中什么才算是常规思路?还在读大学感觉自己写的东西太理想化了,并不明白实际开发中的正确姿势。是不是就算把提醒功能分离出来,用 crontab 来调用一个脚本来执行?

@skydiver :-D 还好我没有语言信仰_(:з」∠)_
longaiwp
2015-12-04 20:23:13 +08:00
@skydiver jawa 当然是万能的!
HypoChen
2015-12-04 20:24:16 +08:00
@letitbesqzr 就是检查所有事件,满足条件后调用 javax.mail 发邮件( SUN 的包),其实 quartz 中的 job 并没有直接发邮件,而是 new 了一个线程专门用来发邮件。在用 timertask 倒是会遇到包括网络超时在内的各种问题都会导致定时任务中断,但 quartz 好像没有这么一说,也是很奇怪

@odirus 之前没有考虑到这种实现,回宿舍研究下

@HentaiMew 突然想到居然没有执行日志, 2333 ,只是在所有事件检查完发个邮件提醒。因为是每天六点执行,表达式是"0 0 6 * * ?"
letitbesqzr
2015-12-04 20:31:15 +08:00
@skydiver 反正比 php 好!
HentaiMew
2015-12-04 21:02:52 +08:00
@HypoChen 不知道你是在什么平台上运行的... 是不是被自动休眠了,例如 SAE 这样的 PaaS 。。。。
iminto
2015-12-04 21:04:52 +08:00
谁现在还用 timertask 这个啊,早过时了。用 ScheduledExecutorService
iminto
2015-12-04 21:05:36 +08:00
@skydiver 因为 crontab 不行,太粗糙
raysmond
2015-12-04 21:09:40 +08:00
crontab 谁说不行? crontab 里面可以执行其他命令啊,我经常执行 bash, ruby, python 的脚本。非要用 java 的话, cron 任务里执行一个你的 java 程序不就行了?
cch123
2015-12-04 21:13:56 +08:00
这个帖子怎么这么欢乐,在 crontab 里执行什么程序都可以
Ouyangan
2015-12-04 21:59:53 +08:00
ScheduledExecutorService 我给满分
ooTwToo
2015-12-04 22:04:29 +08:00
ScheduledExecutorService 可以的
ryd994
2015-12-05 05:34:30 +08:00
@HypoChen 0 6 * * * 分时日月星
另外程序不需要管发邮件的事情,设置好 crond , crond 会把程序输出直接发邮件。(所以不需要的部分 >/dev/null 很重要)
HypoChen
2015-12-05 12:41:43 +08:00
@iminto @Ouyangan @ooTwToo 我还不知道还有这么一种东西,又有需要 get 的技能了,谢谢

@ryd994 是不是可以把发邮件这个任务分离给脚本之类的,用 crontab 来定期执行就可以了?
ryd994
2015-12-05 13:23:46 +08:00
@HypoChen NO 是把程序本身的逻辑做成脚本(判断事件,判断复杂条件之类的)结果直接 echo 。 crond 会捕捉一切输出,如果有任何输出,就会安装配置发一封邮件。你先查怎么让 cron 发邮件到你的邮箱,然后自己试一下就明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241229

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX