编辑搜图
请点击输入图片描述
前言:
以前在项目中实现定时任务,大多使用第三方插件Quartz,本文主要介绍springBoot中如何使用注解的方式更简单的实现定时任务,并且结合以前所讲解的springBoot中发送邮件,实际运用到项目中对数据库进行备份且邮件通知管理员。
环境准备:
Java框架:springBoot2.1.4RELEASE
定时任务:spring注解
项目构建工具:Maven
邮件:spring组件
数据库:Mysql
1、构建springBoot基础工程
编辑搜图
请点击输入图片描述
依赖:
org.springframework.boot
spring-boot-starter-mail
我们先来了解spring中的@Scheduled注解,该注解主要注在方法上,该注解有几个属性:
编辑搜图
请点击输入图片描述
具体的就不一一介绍了下面了解一个重要的属性
cron:
指定一个cron表达式,该表达式是个字符串,以5或6个空格隔开,总共6个或7个域,每个域都代表一个时间单位,例@Scheduled("5 * * * * ?")则代表每过5秒中执行一次,每个域分别代表(年非必填)
[秒] [分] [小时] [日] [月] [周] [年]
序号说明必填允许填写的值允许的通配符1秒是0-59, - * /2分是0-59, - * /3时是0-23, - * /4日是1-31, - * ? / L W5月是1-12 / JAN-DEC, - * /6周是1-7 or SUN-SAT, - * ? / L #7年否1970-2099, - * /
通配符:
- * :表示所有的值
- ? :表示不指定值
- - :表示区间
- , :表示指定多个值
- / :表示指定值递增触发
- L :表示月内最后一天(根据月份)或者最后周内最后一天(星期六)
- W:表示离指定日期最近的一个工作日(周一至周五)
- # :序号(表示每月的第几个周几)
cron示例
描述表达式每5秒执行一次*/5 * * * * ?每一分钟执行一次0 */1 * * * ?每天23点执行一次0 0 23 * * ?每月1号凌晨1点执行一次0 0 1 1 * ?每月最后一天23点执行一次0 0 23 L * ?每周星期天凌晨1点实行一次0 0 1 ? * L在26分、29分、33分执行一次0 26,29,33 * * * ?
2、创建定时任务类
@Component //将该类进行注入交给IOC管理
@EnableScheduling // 开启定时任务
public class TestTask {
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//添加定时任务:每隔5秒执行
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void testTasks() {
String currentDate=simpleDateFormat.format(new Date());
System.err.println("执行定时任务时间: " + currentDate);
}
}
运行结果:
执行定时任务时间: 2020-01-18 01:10:40
执行定时任务时间: 2020-01-18 01:10:45
执行定时任务时间: 2020-01-18 01:10:50
执行定时任务时间: 2020-01-18 01:10:55
...
3、检查Mysql环境变量
因为实现备份数据库功能用到了mysql中的mysqldump命令,在Windows环境必须配置环境变量才能使用该命令.
配置步骤:
编辑搜图
请点击输入图片描述
4、配置完成后对定时任务类进行改造:
@Component //将该类进行注入交给IOC管理
@EnableScheduling // 开启定时任务
public class TestTask {
//时间格式转换
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String username="root";//数据库用户名
private String passord="root";//数据库用户密码
private String dbname="cargills";//备份数据库名
private String path="G:VXGZHsql";//备份文件存储路径
/* 添加定时任务
为了演示每五秒备份一次
正常情况下是每天凌晨进行备份
*/
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void configureTasks() {
//获取当前时间
String currentDate=simpleDateFormat.format(new Date());
//数据库备份命令,使用当前时间+数据库名命名以防文件名重复出错
String cmd="mysqldump -u{0} -p{1} {2} -r {3}{4}_{5}.sql";
cmd=MessageFormat.format(cmd,username,passord,dbname,path,currentDate.replaceAll("-","").replaceAll(" ","").replaceAll(":",""),dbname);
try {
/*执行命令*/
Process process = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
System.err.println(currentDate+"备份数据库失败,报错:"+e.getMessage());
e.printStackTrace();
}
System.err.println(currentDate+"备份数据库成功");
}
}
执行结果:
2020-01-18 02:08:25备份数据库成功
2020-01-18 02:08:30备份数据库成功
2020-01-18 02:08:35备份数据库成功
2020-01-18 02:08:40备份数据库成功
2020-01-18 02:08:45备份数据库成功
编辑搜图
请点击输入图片描述
5、实现邮件通知管理员
实现此功能建议先了解此文:springBoot发送邮件
这里只实现发送带附件文件的邮件通知,更多的邮件类型就不一一赘述了,想了解的可以点击上方链接阅读该文章.
5.1、邮件配置application.properties:
#邮箱服务地址
spring.mail.host=smtp.qq.com
#邮箱账号
spring.mail.username=526277249@qq.com
#邮箱授权码
spring.mail.password=synxiqnkrptnbgeg
#邮箱默认编码
spring.mail.default-encoding=UTF-8
5.2、实现发送邮件工具类
编辑搜图
图片模糊,建议替换或删除×
请点击输入图片描述
@Service
public class SendEmailUtil {
@Value("${spring.mail.username}")
private String sendUser;
@Autowired
private JavaMailSender javaMailSender;
/*发送普通邮件
* Param
* to:接收用户
* subject:邮件主题
* context:邮件正文内容*/
public void sendMail(String to,String subject,String context){
try {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(context);
message.setFrom(sendUser);
javaMailSender.send(message);
System.out.println("----邮件发送成功----");
}catch (Exception e){
System.out.println("邮件发送失败...");
}
}
/*带附件
* Param
* to:接收用户
* subject:邮件主题
* context:邮件正文内容
* filePath:文件路径*/
public void sendAttachmentsMail(String to,String subject,String context,String filePath) {
MimeMessage message=javaMailSender.createMimeMessage();
try {
MimeMessageHelper helper=new MimeMessageHelper(message,true);
helper.setFrom(sendUser);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(context,true);
FileSystemResource file=new FileSystemResource(new File(filePath));
String fileName=file.getFilename();
helper.addAttachment(fileName,file);
javaMailSender.send(message);
System.out.println("----邮件发送成功----");
}catch (Exception e){
System.out.println("邮件发送失败...");
}
}
}
5.3、改动定时任务类
@Component //将该类进行注入交给IOC管理
@EnableScheduling // 开启定时任务
public class TestTask {
@Autowired
public SendEmailUtil sendEmail;
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String username="root";//数据库用户名
private String passord="root";//数据库用户密码
private String dbname="cargills";//备份数据库名
private String path="G:VXGZHsql";//备份文件存储路径
private String adminEmail="24698171@qq.com";//管理员邮件
private String emailSubject="数据库备份结果通知";//邮件标题
/* 添加定时任务
为了演示每五秒备份一次
正常情况下是每天凌晨进行备份
*/
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void configureTasks() {
//获取当前时间
String currentDate=simpleDateFormat.format(new Date());
//数据库备份命令
String cmd="mysqldump -u{0} -p{1} {2} -r {3}{4}_{5}.sql";
//sql文件位置
String sqlPath=path+currentDate.replaceAll("-","").replaceAll(" ","").replaceAll(":","")+"_"+dbname+".sql";
cmd=MessageFormat.format(cmd,username,passord,dbname,path,currentDate.replaceAll("-","").replaceAll(" ","").replaceAll(":",""),dbname);
try {
/*执行命令*/
Process process = Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
System.err.println(currentDate+"备份数据库失败,报错:"+e.getMessage());
sendEmail.sendMail(adminEmail,emailSubject,currentDate+"备份数据库失败,原因:"+e.getMessage());
e.printStackTrace();
}
System.err.println(currentDate+"备份数据库成功");
sendEmail.sendAttachmentsMail(adminEmail,emailSubject,currentDate+"备份数据库成功",sqlPath);
}
}
5.4、测试
编辑搜图
图片模糊,建议替换或删除×
请点击输入图片描述
编辑搜图
请点击输入图片描述
大功告成!
源码:在后台输入(1001)自行提取
不知不觉写到深夜三点,如果认为写的还行那就留下一个关注呗
欢迎转发让更多朋友看到,如有不足欢迎指导!
有任何问题也欢迎在后台留言,或者加入交流群跟大家一起交流!