V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
greenhat233
V2EX  ›  问与答

Java 在指定时间内发送邮件的问题

  •  
  •   greenhat233 · 2019-10-31 11:44:16 +08:00 · 1595 次点击
    这是一个创建于 1850 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近有个需求,前台 vue,后端 Java




    用户可以在自己喜欢的信息上面设置提醒,然后到用户指定的时间的话后台给用户发送提醒邮件,
    这个在指定时间内发送指定邮件不知道有没有更好的方法,现有方法如下:
    1. 写个死循环判断
    2. 写类似这样的 0 1 1 * * ? 2015 cron 任务去执行,不过没有试过,意思大概是指定详细时间让这个任务只执行一次
    3. Java 阻塞队列,延时队列(也未实践)

    或者使用定时器什么的,mjj 们有什么更好的想法
    7 条回复    2019-10-31 17:31:09 +08:00
    aragakiyuii
        1
    aragakiyuii  
       2019-10-31 14:13:33 +08:00 via Android
    quartz 呢,用户前台制定 x 时 x 分 x 秒,后台生成 cron 添加定时任务
    javapythongo
        2
    javapythongo  
       2019-10-31 14:13:58 +08:00
    写个时间轮,设置时间的时候,算一下 duration,以前写了个简单的,你可以参考下 github.com/fangxuee/timewheel
    x66
        3
    x66  
       2019-10-31 15:04:54 +08:00
    如果最小粒度是每分钟,我建议启动一个 0 * * ? * * * 的 cron(每分钟)来扫描当前这一分钟的任务并执行。
    v2orz
        4
    v2orz  
       2019-10-31 15:16:27 +08:00
    MQ 延时消息也能实现
    sujin190
        5
    sujin190  
       2019-10-31 15:36:49 +08:00
    量不多精度要求也不高的话,crontab 其实挺好用的了,每分钟查询判断下就是了
    延时队列的问题是无法撤回或者修改,也不是幂等的,容错要麻烦很多

    https://github.com/snower/forsun

    可以看看之前做的定时调度服务,可以通过一个 key 创建一个定时任务,重复创建幂等,可以方便的撤销修改,任务保存可以使用 redis 持久化任务信息,不担心丢失,最小秒级定时任务高效,支持 http 接口和超时触发请求 http 接口
    lllllliu
        6
    lllllliu  
       2019-10-31 15:43:36 +08:00
    消息队列延时消息,
    还有 Redis 过期事件订阅,
    EscYezi
        7
    EscYezi  
       2019-10-31 17:31:09 +08:00 via iPhone
    起一个线程死循环 15s 扫描一次所有提醒是否距离发邮件的时间小于等于 15s,有的话调用发邮件接口

    不过提醒多的话,调发邮件接口可能要弄个线程池
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:49 · PVG 03:49 · LAX 11:49 · JFK 14:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.