Java 定时任务求教

2023-04-27 14:43:02 +08:00
 lufeng666
4557 次点击
所在节点    程序员
58 条回复
Bingchunmoli
2023-04-27 15:52:01 +08:00
@doyel 是想做个订阅地区天气有雨就会通知带伞的功能,如果用户可以自己输入订阅时间就有点难做,循环感觉不优雅
lufeng666
2023-04-27 15:54:32 +08:00
@mmdsun 已 star
issakchill
2023-04-27 16:10:23 +08:00
@Scheduled 每天查一次 不会多耗性能的
doyel
2023-04-27 16:13:32 +08:00
@Bingchunmoli 那就从拉取天气接口后根据根据结果给用户推吧,前提都是有监听能让你拉起提醒来,要看具体平台和场景了。
xiongge
2023-04-27 16:18:58 +08:00
你可以考虑使用 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 中定义的发送邮件逻辑。

希望这个示例能够帮助你实现你的需求。
Bingchunmoli
2023-04-27 16:21:15 +08:00
@doyel 做的是定时任务查询,而不是监听的
wetalk
2023-04-27 16:23:02 +08:00
简单点的用 xxl-job ,不嫌麻烦手撸时间轮
lizhian
2023-04-27 16:24:37 +08:00
手机助手不是更好吗
CEBBCAT
2023-04-27 16:59:05 +08:00
系统日历不就可以吗?几乎所有的系统都带有日历功能,日历还可以云同步。我感觉可能是文化的差异,国内都忽略了日历这种软件
chirsgod
2023-04-27 16:59:55 +08:00
PowerJob 、XXL-JOB 、Quartz 这些都可以的啊,你这个需求我感觉都用不到这种东西就能实现
aino
2023-04-27 17:09:34 +08:00
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
PVXLL
2023-04-27 17:18:04 +08:00
这种需求还需要( Mysql 数据库?,是不是还得考虑分布式、缓存、配置中心、服务发现、kubernetes ?
NGXDLK
2023-04-27 17:20:33 +08:00
1 、java 里面 @Scheduled 注解应该就能满足
2 、不怕麻烦,搞 cron 定时任务,到点调用 java 发送邮件
NGXDLK
2023-04-27 17:23:05 +08:00
@PVXLL 还得考虑容灾,哈哈
theOneMe
2023-04-27 17:28:09 +08:00
mac 里的提醒事项就行
uasier
2023-04-27 17:31:37 +08:00
非 java ,青龙面板,用着很舒服
burymme11
2023-04-27 17:40:33 +08:00
@lufeng666 我大致理解你的需求了,是不是有很多个通知要推送,每个通知的调度触发点还不一样(有每周,有每月。。)?
如果是这样,个人不推荐 xxl-job 或者 Quartz 等定时调度框架,因为如果后面数据量起来了,会构建越来越多的 job/task ,指标不治本。个人推荐走延时消息,比如 A 要每天 10 点,第一次你监听处理后,再往 topic 里丢,等第二天继续,类似,mq 也会做持久化,消息一般不会丢,读写性能肯定比 db 强
zhaokun
2023-04-27 17:44:09 +08:00
iPhone 提醒 app 就可以实现
nothingistrue
2023-04-27 17:45:57 +08:00
就是个简单的按 cron 表达式发邮件,就别折腾 Java 了,写个不到 100 行的 Shell 扔给 cronb 就行了。用 Java 其实也很简单,Spring 的 @Scheduled 就够了,连 Quartz 都用不上。除非你是往现有应用里面加这个定时功能,否则不要干这种拖裤子放屁的事,没有 Linux 的话 Window 的定时计划加 bat 脚本,也能支持。
wxw752
2023-04-27 17:51:40 +08:00
@lufeng666 #4 其实定时任务扫表的方式并不笨,配合上线程池能满足很多场景了,数据量不大这么做简单高效。

如果真是有上百万要发的邮件,那时候我相信你会选择 mq

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/935932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX