spring03-定时任务
一Spring 定时任务
1、 基于 xml 方式定时任务的配置
1)spring.xml定时任务命名空间的添加
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
2)配置定时任务spring.xml
true
3)创建包taskMyJob类设置定时任务
public class MyJob {
public void job01(){
System.out.println("job01 ....");
}
public void job02(){
System.out.println("job02 ....");
}
}
4)通过main函数TaskTest中测试定时任务
public class TaskTest {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("spring.xml");
}
}
2、 基于注解的方式配置定时任务
1)spring.xml中开启注解配置
2)MyJob2中通过注解设定定时任务
public class MyJob02 {
@Scheduled(cron = "0/3 * * * * ? ")
public void job01(){
System.out.println("job01 ....[MyJob02]");
}
@Scheduled(cron = "0/6 * * * * ? ")
public void job02(){
System.out.println("job02 ....[MyJob02]");
}
}
3)通过main函数TaskTest中测试定时任务(同上)
二.Cron 表达式简介
关于 cronExpression 表达式有至少 6 个(也可能是 7 个) 由空格分隔的
时间元素。 从左至右, 这些元素的定义如下:
1. 秒(0--59)
2. 分钟(0--59)
3. 小时(0--23)
4. 月份中的日期(1--31)
5. 月份(1--12 或 JAN--DEC)
6. 星期中的日期(1--7 或 SUN--SAT)
7. 年份(1970--2099)
0 0 10,14,16 * * ?
每天上午 10 点,下午 2 点和下午 4 点
0 0,15,30,45 * 1-10 * ?
每月前 10 天每隔 15 分钟
30 0 0 1 1 ? 2012
在 2012 年 1 月 1 日午夜过 30 秒时
0 0 8-5 ? * MON-FRI
每个工作日的工作时间
各个时间可用值如下:
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日 1-31 , - * ? / L W C
月 1-12 or JAN-DEC , - * /
周几 1-7 or SUN-SAT , - * ? / L C #
年(可选字段) empty, 1970-2099 , - * /
可用值详细分析如下:
"*" ------字符可以用于所有字段, 在"分" 字段中设为"*"表示"每一分
钟"的含义。
"?" ------字符可以用在"日" 和"周几" 字段.它用来指定'不明确的值'.
这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。 在
后面的例子中可以看到其含义。
"-" ------字符被用来指定一个值的范围, 比如在"小时" 字段中设为
"10-12"表示"10 点到 12 点"。
"," ------字符指定数个值。 比如在"周几" 字段中设为"MON,WED,FRI"表
示"the days Monday, Wednesday, and Friday"。
"/" ------字符用来指定一个值的的增加幅度.比如在"秒" 字段中设置为
"0/15"表示"第 0, 15, 30,和 45 秒"。 而"5/15"则表示"第 5, 20,
35,和 50".
在'/'前加"*"字符相当于指定从 0
秒开始.每个字段都有一系列可以开始或结束的数值。 对于"秒" 和"分"
字段来说, 其数值范围为 0 到 59, 对于"小时"字段来说其为 0 到
23,对于"日" 字段来说为 0 到 31,而对于"月" 字段来说为1 到 12。
"/"字段仅仅只是帮助你在允许的数值范围内从开始"第 n"的值。
"L" ------字符可用在"日" 和"周几" 这两个字段。 它是"last"的缩写,
但是在这两个字段中有不同的含义。 例如,"日"
字段中的"L"表示"一个月中的最后一天"
------对于一月就是 31 号对于二月来说就是 28 号(非闰年) 。 而在"周几"
字段中,它简单的表示"7" or "SAT", 但是如果在"周几" 字段中使用
时跟在某个数字之后,它表示"该月最后一个星期×"
------比如"6L"表示"该月最
后一个周五"。 当使用'L'选项时,指定确定的列表或者范围非常重要,
否则你会被结果搞糊涂的。
"W" ------可用于"日" 字段。 用来指定历给定日期最近的工作日(周一到
周五)。 比如你将"日" 字段设为"15W", 意为: "离该月 15
号最近的工作日"。
因此如果 15 号为周六, 触发器会在 14 号即周五调用。 如果 15
号为周日,触发器会在 16 号也就是周一触发。 如果 15
号为周二,那么当天就会触发。 然而如果你将"日"
字段设为"1W",而一号又是周六,触发器会于下周一也就是当月的
3号触发,因为它不会越过当月的值的范围边界。 'W'字符只能用于"日"
字段的值为单独的一天而不是一系列值的时候。
"L" 和"W" 可以组合用于"日" 字段表示为'LW', 意为"该月最后一个
工作日"。
"#" ------字符可用于"周几" 字段。 该字符表示"该月第几个周×" ,
比如"6#3"表示该月第三个周五( 6 表示周五而"#3"该月第三个)。
再比如:
"2#1" =表示该月第一个周一而"4#5" =该月第五个周三。
注意如果你指定"#5"
该月没有第五个"周×" , 该月是不会触发的。
"C" ------字符可用于"日" 和"周几" 字段, 它是"calendar"的缩写。
它表示为基于相关的日历所计算出的值(如果有的话) 。 如果没有关联的日历,
那它等同于包含全部日历。 "日" 字段值为"5C"表示"日历中的第一天或者 5
号
以后", "周几" 字段值为"1C"则表示"日历中的第一天或者周日以后"。
对于"月份" 字段和"周几" 字段来说合法的字符都不是大小写敏感的。
一些例子:
"0 0 12 * * ?"每天中午十二点触发
"0 15 10 ? * *"每天早上 10: 15 触发
"0 15 10 * * ?"每天早上 10: 15 触发
"0 15 10 * * ? *"每天早上 10: 15 触发
"0 15 10 * * ? 2005" 2005 年的每天早上 10: 15 触发
"0 * 14 * * ?"每天从下午 2 点开始到 2 点 59 分每分钟一次触发
"0 0/5 14 * * ?"每天从下午 2 点开始到 2: 55 分结束每 5
分钟一次触发
"0 0/5 14,18 * * ?"每天的下午 2 点至 2: 55 和 6 点至 6 点 55
分两个时间段内每 5 分钟一次触发
"0 0-5 14 * * ?"每天 14:00 至 14:05 每分钟一次触发
"0 10,44 14 ? 3 WED"三月的每周三的 14: 10 和 14: 44 触发
"0 15 10 ? * MON-FRI"每个周一、 周二、 周三、 周四、 周五的 10: 15
触发
"0 15 10 15 * ?"每月 15 号的 10: 15 触发
"0 15 10 L * ?"每月的最后一天的 10: 15 触发
"0 15 10 ? * 6L"每月最后一个周五的 10: 15
三.利用spring实现定时发邮件
1.pom.xml配置
4.0.0
com.shsxt
spring07-mail
1.0-SNAPSHOT
spring07-mail
UTF-8
1.8
1.8
junit
junit
4.12
test
javax.mail
mail
1.4
org.springframework
spring-context
4.3.2.RELEASE
org.springframework
spring-context-support
4.3.2.RELEASE
org.springframework
spring-aop
4.3.2.RELEASE
2.spring.xml中开启定时注解配置
true
3.创建package---task-->MyJob2通过注解设置定时任务
/**
* spring定时发送邮件
*/
public class MyJob02 {
@Autowired
private SimpleOrderManager orderManager;
// @Scheduled(cron = "0/15 * * * * ? ")
// public void job01(){
// System.out.println("send mail --- [start]");
// orderManager.placeOrder();
// System.out.println("send mail --- [end]");
// }
@Scheduled(cron = "0/10 * * * * ? ")
public void job02() throws MessagingException {
System.out.println("send mail --- [start]");
orderManager.sendFileMail();
System.out.println("send mail --- [end]");
}
}
4.引入spring发送邮件封装的SimpleOrderManager类
OrderManager接口
/**
* 发送邮件接口定义
* @author lp
*
*/
public interface OrderManager {
void placeOrder();
}
实现类SimpleOrderManager类
/**
* 接口实现类
*/
public class SimpleOrderManager implements OrderManager {
private MailSender mailSender;
private SimpleMailMessage templateMessage;
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
public void setTemplateMessage(SimpleMailMessage templateMessage) {
this.templateMessage = templateMessage;
}
@Override
public void placeOrder() {
SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
msg.setTo("[email protected]");
msg.setText("test...asdasdasdsd");
try {
this.mailSender.send(msg);
} catch (MailException ex) {
System.err.println(ex.getMessage());
}
}
public void sendFileMail() throws MessagingException {
JavaMailSender mailSender2= (JavaMailSender) mailSender;
MimeMessage message= mailSender2.createMimeMessage();
message.setSubject("spring_mail");
// 创建带有附件的消息帮组类
MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8");
helper.setTo(new InternetAddress("[email protected]"));//设置接收人
helper.setText("Thank you for ordering!");
helper.setFrom("[email protected]");
helper.addAttachment("28期.bmp", new File("E:\\java_28\\spring08-mail\\28期.bmp"));
mailSender2.send(message);
}
}
5.测试TaskTest通过main方法开启定时发送邮件功能
public class TaskTest {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("spring.xml");
}
}
6.测试结果