java定时任务

背 / 景 / 介 / 绍

近期项目开发中需要发送提醒邮件的功能,即在某个指定日期之前,发送提醒邮件给某人,最后主要通过一个定时扫描的任务来实现的,下面就简单介绍一下如何实现该功能。

定时任务

JAVA实现定时任务的方法有多种,目前主要的几种实现方式:

一、JDK自带 :JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService;

二、Quartz :简单却强大的JAVA作业调度框架

三、Spring3.0以后自带的task :可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多;

本文主要介绍下第三种方式实现定时任务。Spring 3.0+ 自带的任务调度实现,主要依靠TaskScheduler接口的几个实现类实现,具体实现方法如下

(1)Spring配置文件实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6NqVc2qA-1661955957784)(upload://zCc6ES5hj2DBHnWPrUcKMateYLQ.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3xiDCLb-1661955957785)(upload://h88L5V8vAweB30HCmYiilfqh61d.png)]

(2)注解实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlZtkym8-1661955957785)(upload://3GpKtpRGvQHbFVGLPVqJW572s7R.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4T72iAcu-1661955957785)(upload://xjhxAB1NicXTcwvoRcK6jTWBDtV.png)]

(3)代码动态添加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmZZ6pjj-1661955957786)(upload://7Y1hl7hsPxN6rwknkDIgcqvRTbK.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fpuMpTb4-1661955957786)(upload://xNevA58uyKrG1l85OPs9asyiRwU.png)]

cron表达式的使用方法

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

  • Seconds Minutes Hours DayofMonth Month DayofWeek Year
  • Seconds Minutes Hours DayofMonth Month DayofWeek

每一个域可出现的字符如下:

  • Seconds: 可出现", - * /"四个字符,有效范围为0-59的整数
  • Minutes: 可出现", - * /"四个字符,有效范围为0-59的整数
  • Hours: 可出现", - * /"四个字符,有效范围为0-23的整数
  • DayofMonth: 可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
  • Month: 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEC
  • DayofWeek: 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
  • Year: 可出现", - * /"四个字符,有效范围为1970-2099年

其中,每一个域都使用数字,但还可以出现特殊字符,下面简单介绍几个常用的含义:

* 表示匹配该域的任意值,假如在Minutes域使用*, 即表示每分钟都会触发事件。

只能用在DayofMonth和DayofWeek两个域。

- 表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。

# 用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

总结

以上是java中比较简单的实现定时任务的方法,还有其他两种方法可以查看参考文献。此外java的定时任务还有比较复杂的应用,比如动态增加,以及Quartz的集群模式等在学习中,欢迎大家批评指正。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQZVWXNl-1661955957786)(upload://5Yx5aAoj4mfQzgvrhyKWiZE7n9c.jpeg)]