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

求友们帮助, Java 到期提醒功能如何开发

  •  
  •   Allenxup · 274 天前 · 2814 次点击
    这是一个创建于 274 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在是有个车辆信息表,表里有年检到期日期 inspection_date 和保险到期日期 insurance_date 字段,现在的需求是对这些时间进行监控剩余 15 天有效期进行消息提醒,推送通知给驾驶人员。想问下这场景应该怎么做?感谢

    32 条回复    2023-07-29 06:37:16 +08:00
    lsk569937453
        1
    lsk569937453  
       274 天前
    每天定时任务扫描一下呗。
    buchikoma
        2
    buchikoma  
       274 天前
    起一个永驻的后台进程,在设置 inspection_date 和 insurance_date 的时候,分别计算 Duration (多久秒之后到期),去后台进程注册这个任务并在 Duration 时间之后发送一条 message 给前台进程做推送,Duration 可以理解为一个 timeout
    v2eb
        3
    v2eb  
       274 天前
    Timer 就好了, 项目启动时候扫一下当天的, 定时任务每天扫, 扫出来用 Timer 处理
    simonlu9
        4
    simonlu9  
       274 天前
    redis 延时队列
    me1onsoda
        5
    me1onsoda  
       274 天前
    延迟队列
    Allenxup
        6
    Allenxup  
    OP
       274 天前
    @buchikoma 感谢解答。java 永驻的后台进程有什么实现方式嘛
    brader
        7
    brader  
       274 天前
    @simonlu9
    @me1onsoda 延迟不太好吧,还是存表里,每天定时查询需要发送的信息好点。你存延时的话,他这种车辆年检,从录入到年检可能 6 年,这延时队列越堆越恐怖
    xwayway
        8
    xwayway  
       274 天前   ❤️ 10
    这不就是一个定时任务,每天扫一遍就行了的事么。延迟队列瞎 JB 扯淡,为了用中间件而用。
    Allenxup
        9
    Allenxup  
    OP
       274 天前
    @simonlu9 放延时队列的话,如果我到期日期更新了要怎么处理呢
    Allenxup
        10
    Allenxup  
    OP
       274 天前
    @brader 是的,我也是考虑到这一点。我这边还要驾驶证的到期提醒需求
    buchikoma
        11
    buchikoma  
       274 天前
    @Allenxup #6 没用过 java ,但比较简单且通用的就是起一个 Supervisor 去监控进程,或者用 actor 这种模型
    brader
        12
    brader  
       274 天前
    @Allenxup 我以前做过类似的需求,通知表字段就记录一些标识、内容、通知时间之类的,每天在白天多少点发通知。我们做白天的话,一是不会打扰用户,二是我们接入的是厂商通知栏推送,有些厂商晚上是不允许你推送的
    blackmirror
        13
    blackmirror  
       274 天前
    这不最简单的功能了,定时跑不就完了,还真要造火箭 啊
    luomao
        14
    luomao  
       274 天前
    创建一个 Bean 然后写你的方法
    @Scheduled(cron = "0 0 9 * * ?")
    每天早上 9 点执行一遍,自己判断哪些需要发送,然后执行
    sujin190
        15
    sujin190  
       274 天前 via Android
    长时任务不要用暂时对接和计时器,否则就是个大坑,最靠谱最简单的还是每天执行个任务查询下满足条件的执行就好了
    mdn
        16
    mdn  
       274 天前
    每天 9 点定时检测,>=15 && < 16 的发送短信
    nkidgm
        17
    nkidgm  
       274 天前
    无必要放队列啊,每天定期扫表的时间字段,发现时间差在规定范围内,就触发通知程序。

    新车年检有效期一般是 2 年,你不会提前 2 年就把年检的通知消息放到消息里面吧,你得保证 2 年期间这个消息不会丢失才行,还有队列被撑爆得情况。
    Ericcccccccc
        18
    Ericcccccccc  
       274 天前   ❤️ 1
    记住一点, 任何定期触发的功能靠的都是轮询.
    nkidgm
        19
    nkidgm  
       274 天前
    最简单用 spring task 去执行 SQL 就行了。
    mmdsun
        20
    mmdsun  
       274 天前
    每天跑,SQL 查 监控剩余 ∈[15, 16 ]天 , 查出来处理通知就可以了。

    数据量大可以用那种支持 mapreduce 分片的任务框架,比如 PowerJob 框架,这个作者也在 v 站。
    kanepan19
        21
    kanepan19  
       274 天前
    这种需求要什么延迟队列, 又不是订单超时, 直接扫库就好了。
    那啥啥某电商不就直接扫库的吗?
    simbaCheng
        22
    simbaCheng  
       274 天前
    时间轮
    a62527776a
        23
    a62527776a  
       274 天前
    时间轮不是非常成熟吗?
    ZhiyuanLin
        24
    ZhiyuanLin  
       274 天前
    今年刚做过几亿用户类似需求的项目,也是写个 Spring Batch 每天去扫数据库的。没必要用多复杂的架构。
    senjyougahara
        25
    senjyougahara  
       274 天前
    可以一周或半周跑一次轮询,然后逐个通知
    vagusss
        26
    vagusss  
       274 天前
    定时扫库就行, 简单有效
    wqhui
        27
    wqhui  
       274 天前
    每天扫一下表不就行了吗,怕数据量太大,用 SQL 把筛选出来的数据扔个临时表,应用分批取出来发通知
    数据更新导致发错其实不要紧,通知类的东西不太重要。比如 8 点扫表这个人到期了,但 10 点才发出通知,这个人 9 点跑去更新了到期时间,照样给他发也没事又不会导致什么记录被覆盖
    simonlu9
        28
    simonlu9  
       274 天前
    @Allenxup 很简单,删掉就可以了,参考 redission 实现,没必要把时间久远的放 redis,用 xxl 每天扫描一遍是不是快到 24 小时结束了,如果是旧放到 redission
    la2la
        29
    la2la  
       274 天前
    定时任务每天扫一遍就行呗
    hevi
        30
    hevi  
       274 天前
    虚心请教定时任务的逻辑:

    发送前是否还要查一次有没已经发过?如果定时器还没扫之前,程序崩了
    huzhizhao
        31
    huzhizhao  
       274 天前 via iPhone
    定时器扫不就完了。
    xuanbg
        32
    xuanbg  
       273 天前
    定时器每天凌晨扫一次表,符合条件的发通知就完了。写代码,最简单有效的笨方法才是最好的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   884 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:58 · PVG 04:58 · LAX 13:58 · JFK 16:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.