- 有个需求想问下各位大佬:我想用 java 技术实现被动通知。
- 举个例子:我每周五下午 5 点都要写周报,想创建个任务,每周五下午 5 点都会给我发邮件,通知我去写周报。
- 要求是粒度精细到每天就行,任务都是有周期的,可能每天、每周、每月、每年。
- 我能想到的实现方式是存个 cron 表达式到 mysql 数据库,然后每天遍历一遍看是否需要触发。但是感觉很笨,有没有那种开源的三方 jar 可以引用,能快速简洁实现这样的功能的?

2 ilovey482i Apr 27, 2023 Quartz |
3 hhjswf Apr 27, 2023 这种事情手机定个闹钟不是更简单? |
4 lufeng666 OP @Kontinue 每天都遍历一遍所有任务,这个方法很笨,因为大多数任务并不需要执行。数据量上来后,这个方法也特别耗性能。corn 表达式的生成与解析有没有啥好的三方库推荐的? |
5 grance Apr 27, 2023 xxl |
6 lission Apr 27, 2023 同 2 楼 Quartz |
7 hidemyself Apr 27, 2023 一个定时任务就行了 遍历每个任务看下有没有到下次执行时间,到了就执行,没到就跳过 |
8 Bingchunmoli Apr 27, 2023 via Android 同问,如果做一个用户自定义时间的定时任务,怎么轻量一点 |
9 yyfbbb Apr 27, 2023 用 github actions 执行规则,设置每周五定时执行就可以 |
10 doyel Apr 27, 2023 写个 sendmail 用 OS 的 cron 调用,一个循环日程就能完成的事情,还要跑个应用吗。。。 |
11 linauror Apr 27, 2023 感觉日历中的日程基本就可以满足你的需求(小米),可以重复每天,或者周,月,年 |
12 crazyweeds Apr 27, 2023 其实自己写一个也很快,Timer 就能实现。 轻量开源就是 Quartz ,但是也挺烦的其实。 |
13 fengleiyidao Apr 27, 2023 Quartz +1 |
14 SmartTom Apr 27, 2023 用分布式的 xxjob 吧 |
15 goodidea1 Apr 27, 2023 chatgpt 会给你答案 |
16 mmdsun Apr 27, 2023 推荐 powerjob 这个作者也在 v 站 |
17 MIUIOS Apr 27, 2023 Quartz 还要自己写 有点麻烦, 直接上 xxl-job 吧 然后写一个发送邮件就行了 我记得里面自带, 你一句代码都不用写 |
18 wqhui Apr 27, 2023 这么简单的操作只想 crontab 懒得写应用,或者你说个复杂点的场景? |
19 RightHand Apr 27, 2023 via Android win 计划任务调用 jar ,Linux 就 cron 呗 |
20 SilentRhythm Apr 27, 2023 延时队列是否可行,创建和触发时判断下次通知的时间,不过不知道 op 数据量有多大 |
21 Bingchunmoli Apr 27, 2023 via Android @doyel 是想做个订阅地区天气有雨就会通知带伞的功能,如果用户可以自己输入订阅时间就有点难做,循环感觉不优雅 |
23 issakchill Apr 27, 2023 @Scheduled 每天查一次 不会多耗性能的 |
24 doyel Apr 27, 2023 @Bingchunmoli 那就从拉取天气接口后根据根据结果给用户推吧,前提都是有监听能让你拉起提醒来,要看具体平台和场景了。 |
25 xiongge Apr 27, 2023 你可以考虑使用 Quartz Scheduler 这个开源的 Java 库来实现你的需求。它是一个功能强大的任务调度框架,支持多种任务周期(每天、每周、每月、每年等),可以非常方便地设置任务的触发时间和频率,并且支持任务的持久化存储。 在你的应用中引入 Quartz Scheduler 库后,你可以通过编写一个 Job 类来定义你的任务逻辑,然后通过创建一个 Trigger 对象来设置任务的触发时间和频率。你还可以将任务的配置信息存储到数据库中,并且在应用启动时从数据库中读取配置信息来动态创建任务。 以下是一个使用 Quartz Scheduler 实现定时发送邮件的示例代码: java Copy code // 定义一个 Job 类来发送邮件 public class SendEmailJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { // 在这里编写发送邮件的逻辑 } } // 创建一个 Trigger 对象来设置任务的触发时间和频率 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("sendEmailTrigger", "email") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 17 ? * FRI")) // 每周五下午 5 点触发 .build(); // 创建一个 SchedulerFactory 对象并启动 Scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); scheduler.start(); // 注册 Job 和 Trigger JobDetail job = JobBuilder.newJob(SendEmailJob.class) .withIdentity("sendEmailJob", "email") .build(); scheduler.scheduleJob(job, trigger); 在上面的代码中,我们定义了一个 SendEmailJob 类来发送邮件,然后创建了一个 Trigger 对象来设置任务的触发时间和频率,最后将 Job 和 Trigger 注册到 Scheduler 中。在 Scheduler 启动后,当触发时间到达时,Quartz Scheduler 就会自动执行 SendEmailJob 中定义的发送邮件逻辑。 希望这个示例能够帮助你实现你的需求。 |
26 Bingchunmoli Apr 27, 2023 via Android @doyel 做的是定时任务查询,而不是监听的 |
27 wetalk Apr 27, 2023 简单点的用 xxl-job ,不嫌麻烦手撸时间轮 |
28 lizhian Apr 27, 2023 手机助手不是更好吗 |
29 CEBBCAT Apr 27, 2023 系统日历不就可以吗?几乎所有的系统都带有日历功能,日历还可以云同步。我感觉可能是文化的差异,国内都忽略了日历这种软件 |
30 chirsgod Apr 27, 2023 PowerJob 、XXL-JOB 、Quartz 这些都可以的啊,你这个需求我感觉都用不到这种东西就能实现 |
31 aino Apr 27, 2023 Cron 表达式是一种用于指定定时任务执行时间的语法格式。它由 6 个字段组成,分别表示秒、分、时、日、月、周几。每个字段可以是一个数值、一组数值、一个范围、一个通配符或一些组合。 Cron 表达式的格式为:秒 分 时 日 月 周几 下面是每个字段可以包含的值: 秒:0~59 分:0~59 时:0~23 日:1~31 月:1~12 周几:0~6 ( 0 表示周日) 除了上述的数值外,还可以使用通配符*表示任意值,使用逗号,表示多个值,使用连字符-表示一个范围,使用斜杠 /表示间隔时间。 例如,下面的 Cron 表达式表示每天的上午 10 点执行一次任务: 0 0 10 * * ? 又如,下面的 Cron 表达式表示每周五晚上 10 点到 11 点之间每隔 5 分钟执行一次任务: 0 */5 22-23 ? * FRI |
32 PVXLL Apr 27, 2023 这种需求还需要( Mysql 数据库?,是不是还得考虑分布式、缓存、配置中心、服务发现、kubernetes ? |
35 theOneMe Apr 27, 2023 mac 里的提醒事项就行 |
36 uasier Apr 27, 2023 非 java ,青龙面板,用着很舒服 |
37 burymme11 Apr 27, 2023 @lufeng666 我大致理解你的需求了,是不是有很多个通知要推送,每个通知的调度触发点还不一样(有每周,有每月。。)? 如果是这样,个人不推荐 xxl-job 或者 Quartz 等定时调度框架,因为如果后面数据量起来了,会构建越来越多的 job/task ,指标不治本。个人推荐走延时消息,比如 A 要每天 10 点,第一次你监听处理后,再往 topic 里丢,等第二天继续,类似,mq 也会做持久化,消息一般不会丢,读写性能肯定比 db 强 |
38 zhaokun Apr 27, 2023 iPhone 提醒 app 就可以实现 |
39 nothingistrue Apr 27, 2023 就是个简单的按 cron 表达式发邮件,就别折腾 Java 了,写个不到 100 行的 Shell 扔给 cronb 就行了。用 Java 其实也很简单,Spring 的 @Scheduled 就够了,连 Quartz 都用不上。除非你是往现有应用里面加这个定时功能,否则不要干这种拖裤子放屁的事,没有 Linux 的话 Window 的定时计划加 bat 脚本,也能支持。 |
40 rockddd Apr 27, 2023 |
41 sadfQED2 Apr 27, 2023 via Android while(True){ sleep(1000) if(time==XXX){发邮件} } |
42 direction Apr 27, 2023 xxl-job |
43 itechify PRO 腾讯轻联,原腾讯 hiflow ,2023 年 9 月 22 日前升级个版每月 3000 个任务,免费版 1000 个任务。感觉还行 |
44 Nilus Apr 27, 2023 |
45 zhady009 Apr 27, 2023 如果就如你描述的那样根本没必要引用什么库 如果有更复杂的要求和场景才可能需要 |
47 lucaslee Apr 27, 2023 如果你想练手写代码,那二楼已经有答案了。如果就是为了完成你的任务,那么找个现成的手机 app 吧,按照你的描述,todo 类的就足够用了,我认为是成本最低的。 |
48 carytseng Apr 27, 2023 我司的钉钉每天下班前会提醒写周报 |
49 009694 Apr 28, 2023 via iPhone crontab+python 1 分钟写完的需求 愣是被你描述成需要先评审再立项的大项目了 |
50 Ericcccccccc Apr 28, 2023 定时任务本质就是轮训, 你想的方法是正确的 而实际上实现一个定时任务系统, 可以配置各种任务就是用数据库实现的, 先看哪些任务要执行, 然后写进数据库里, 然后轮训, 到了要执行的时候就拿出来执行 |
51 tedzhou1221 Apr 28, 2023 “每天遍历一遍看是否需要触发” 也没多笨。主要是简单。 我有个想法。(只是想法) 参考多级时间轮的实现方式。或 Rocket MQ 的延时列队 级别 年级别、月级别、天级别。年级别,一年只会遍历一次,月级别一个月遍历一次。 反正就是复杂设计了。如果没多少数据里,每天全遍历也不会有什么问题吧。 |
52 hongchends1 Apr 28, 2023 你可以搞个 iOS 上的自动化 每周五触发 |
53 miaotaizi Apr 28, 2023 定时任务去读取配置的提醒(将来要发生的), 往延迟队列里面推 是不是就解决了 |
54 fifa899 Apr 28, 2023 日级别的设置个每日任务.每天晚上遍历任务表.发送每日任务延时消息到 MQ 延迟队列. 我们线上几百个用户就是这么搞的.不可能做几百个定时线程挂在服务器里 |
55 MonkeyJon Apr 28, 2023 xxlJob 方便简洁 |
56 howfree Apr 28, 2023 xxljob |
57 season8 Apr 28, 2023 最简单是闹钟、日程提醒,或者相关微信公众号提醒 都 cron 了,直接一个 shell 脚本呗 都就 java 了,用 spring 的定时任务也行啊,多个任务怕延迟可以搞个线程池 好多任务需要管理,用 xxl 这种小事,没必要复杂化,整一堆够你写多少个周报了 |
58 easyalarm May 6, 2023 via Android 去 https://drive.google.com/drive/mobile/folders/1M5YBI9zBE6-dV6o0sQo-8wNAgq-hPcYV 下载一个 apk 然后把这两行贴进去就行了 提醒:再不写写周班就卷铺盖回家 每周:5 时间:15:00 |