V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HypoChen
V2EX  ›  Java

定时任务经常挂怎么办

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

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

    所以,作为一个合格的 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   ·   实用小工具   ·   2547 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:24 · PVG 09:24 · LAX 17:24 · JFK 20:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.