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

Java 实现分钟提醒

  •  
  •   Archangell · 2019-06-24 16:55:55 +08:00 · 2781 次点击
    这是一个创建于 1958 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问各位大佬 如何实现一个功能 用户主动添加提醒事件分钟级别 举例一个场景 学生添加课程每周一都有这节课 课前 5 分钟进行提醒。当学生量大的时候 基本等于每分钟都可能存在提醒 请说下实现思路。 我的思路是保存学生录入的提醒频率 每周每天等 然后根据课程开始时间和提醒提前时间(提前 5 分钟 半小时或一小时)进行提醒 但这样感觉很印象效率 每分钟都得去判断是否需要提醒 还有个思路为 添加提醒后 就根据频率定制计时器 但这样一个提醒创建之后 就永久存在一个计时器任务且项目不停止计时器也不会从内存中移出也不会被 gc 回收 一直执行着 两个思路感觉都不是很友好 有大佬能提点一下吗 如何实现

    17 条回复    2019-06-25 18:54:33 +08:00
    zhady009
        1
    zhady009  
       2019-06-24 17:19:47 +08:00
    不知道你的课有没有是表示一天中是第几节课的字段

    要一个课程通知表 记录基本的信息 还有一个字段是表示第几节课的.

    然后定时任务 获取当前时间 根据时间来判断是第几节课 或者你自己映射一下都可以

    定时 sql 就带上星期几第几课的条件 获得 list 然后获取 uid 给他们推

    脑测
    wolfie
        2
    wolfie  
       2019-06-24 17:23:09 +08:00
    写几个标点符号吧。

    每几分钟查一次数据,然后在 Java 处理。
    zhady009
        3
    zhady009  
       2019-06-24 17:43:09 +08:00
    没看到是用户自定义设置 这样就只能每分钟调一次了 其实也没什么的

    添加定时器那个肯定不行 用户多了肯定有问题
    sigmapi
        4
    sigmapi  
       2019-06-24 17:47:31 +08:00
    直接用 quartz, 有 cron trigger
    自己写的话,用 ScheduledExecutorService 就可以了,新建提醒时算出下次触发时间,每次触发的时候再算出下次触发的时间加到 executor 里
    也可以用效率更高的 Hash Wheel 数据结构 https://stackoverflow.com/questions/867621/efficient-timer-algorithm
    misaka19000
        5
    misaka19000  
       2019-06-24 17:56:31 +08:00
    这排版楼上你们居然看得下去
    Cyron
        6
    Cyron  
       2019-06-24 18:01:53 +08:00 via iPhone
    上 quartz 吧
    Archangell
        7
    Archangell  
    OP
       2019-06-24 18:32:40 +08:00
    @wolfie 哈哈哈 不好意思 习惯空格分隔了
    如果是几分钟查一次 就要做到每分钟查询了 这样不是特别耗性能吗
    zhady009
        8
    zhady009  
       2019-06-24 21:01:20 +08:00 via iPhone
    @Archangell 一分钟一次根本没啥啊 只要你那次查询查出来的就是需要被通知的学生
    akira
        9
    akira  
       2019-06-24 21:53:20 +08:00
    功能优先,优化什么的着急啥。

    另外,“永久存在一个计时器任务” 的情况是很正常的,几个几十个计时器一直跑 都不奇怪的
    zzl22100048
        10
    zzl22100048  
       2019-06-25 08:16:39 +08:00
    app 还是 web ?
    wolfie
        11
    wolfie  
       2019-06-25 08:17:11 +08:00
    @Archangell #7
    如果数据库压力不大,每分钟查一次就可以。

    『提前 5 分钟』为例,每 10 分钟查一次未来 6 分钟 ~ 16 分钟 需要提醒的数据。只是一个思路,具体间隔自行选择。
    zzl22100048
        12
    zzl22100048  
       2019-06-25 08:19:47 +08:00
    让客户端去提醒呗
    Archangell
        13
    Archangell  
    OP
       2019-06-25 09:04:26 +08:00
    @sigmapi 感谢感谢 这个看起来十分有用 我研究研究
    @akira 那只是一个学生 设置的一个提醒 如果是 1000 个学生 每天三个提醒 那不是就有 3000 个了
    nekoneko
        14
    nekoneko  
       2019-06-25 09:35:56 +08:00
    每分钟查一遍数据库,或者查缓存,最简单。或者做一个按提醒时间排序的有序阻塞队列,一个线程向队列写,一个线程取数据做定时任务
    vance
        15
    vance  
       2019-06-25 11:33:56 +08:00
    每天凌晨查出要当天要提醒的时间和学生,按照当天的时间段动态设置提醒任务,然后删除前一天的提醒
    akira
        16
    akira  
       2019-06-25 18:33:42 +08:00
    @Archangell 例如设定一个 1 分钟的定时器,然后这个定时器每次 检查 这一次 有 哪些学生需要提醒 ,这样就可以了啊
    kevinv
        17
    kevinv  
       2019-06-25 18:54:33 +08:00
    环形队列
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   911 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 113ms · UTC 21:36 · PVG 05:36 · LAX 14:36 · JFK 17:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.