专业的JAVA编程教程与资源

网站首页 > java教程 正文

springBoot定时备份数据库邮件通知

temp10 2024-10-08 18:11:08 java教程 10 ℃ 0 评论

编辑搜图


springBoot定时备份数据库邮件通知

请点击输入图片描述


前言:


以前在项目中实现定时任务,大多使用第三方插件Quartz,本文主要介绍springBoot中如何使用注解的方式更简单的实现定时任务,并且结合以前所讲解的springBoot中发送邮件,实际运用到项目中对数据库进行备份且邮件通知管理员。


环境准备:


Java框架:springBoot2.1.4RELEASE

定时任务:spring注解

项目构建工具:Maven

邮件:spring组件

数据库:Mysql


1、构建springBoot基础工程


编辑搜图


请点击输入图片描述


依赖:

<!--邮件依赖-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-mail</artifactId>

</dependency>


我们先来了解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:\\VXGZH\\sql\\";//备份文件存储路径


/* 添加定时任务

为了演示每五秒备份一次

正常情况下是每天凌晨进行备份

*/

@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:\\VXGZH\\sql\\";//备份文件存储路径

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)自行提取


不知不觉写到深夜三点,如果认为写的还行那就留下一个关注呗

欢迎转发让更多朋友看到,如有不足欢迎指导!

有任何问题也欢迎在后台留言,或者加入交流群跟大家一起交流!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表