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

Java 实现分钟提醒

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

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

    17 回复  |  直到 2019-06-25 18:54:33 +08:00
        1
    zhady009   167 天前
    不知道你的课有没有是表示一天中是第几节课的字段

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

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

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

    脑测
        2
    wolfie   166 天前
    写几个标点符号吧。

    每几分钟查一次数据,然后在 Java 处理。
        3
    zhady009   166 天前
    没看到是用户自定义设置 这样就只能每分钟调一次了 其实也没什么的

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

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

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