V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Allenxup
V2EX  ›  程序员

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

  •  
  •   Allenxup · 2023-07-28 10:39:53 +08:00 · 3111 次点击
    这是一个创建于 520 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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