定时任务经常挂怎么办 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HypoChen
V2EX    Java

定时任务经常挂怎么办

  •  
  •   HypoChen
    Hyponet 2015-12-04 20:04:13 +08:00 5571 次点击
    这是一个创建于 3612 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

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

    @ryd994 是不是可以把发邮件这个任务分离给脚本之类的,用 crontab 来定期执行就可以了?
    ryd994
        20
    ryd994  
       2015-12-05 13:23:46 +08:00 via Android
    @HypoChen NO 是把程序本身的逻辑做成脚本(判断事件,判断复杂条件之类的)结果直接 echo 。 crond 会捕捉一切输出,如果有任何输出,就会安装配置发一封邮件。你先查怎么让 cron 发邮件到你的邮箱,然后自己试一下就明白了
    honam
        21
    honam  
       2015-12-07 19:20:28 +08:00
    你都不看一下日志为啥挂
    tryfinally
        22
    tryfinally  
       2015-12-09 16:42:56 +08:00
    crontab 任务失败怎么自动恢复?
    SparkMan
        23
    SparkMan  
       2015-12-22 10:02:26 +08:00
    @TangMonk
    @skydiver 这根语言有毛关系?跟框架有什么关系?程序出异常了,都不看日志吗?都不看走到哪一步了嘛?
    skydiver
        24
    skydiver  
       2015-12-22 11:02:40 +08:00
    @SparkMan 爱特我干嘛,挖坟有意思么?调侃一样就触发你神经了?
    TangMonk
        25
    TangMonk  
       2015-12-22 14:03:01 +08:00
    @HypoChen 一般要求不高的简单任务(不需要任务失败自动恢复什么的),用 crontab 就够了。

    复杂点的,分布式神马的,就需要一些第三方的了
    TangMonk
        26
    TangMonk  
       2015-12-22 14:03:37 +08:00
    @SparkMan 息怒息怒
    ooTwToo
        27
    ooTwToo  
       2016-01-04 14:10:26 +08:00
    楼主这个开源了么 我想看看。
    win7pro
        28
    win7pro  
       2019-08-23 09:40:18 +08:00
    提醒用喵提醒,直接 http 跨平台
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     898 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 21:45 PVG 05:45 LAX 14:45 JFK 17:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86