本篇主要讲:
- JMS邮件发送
- Async异步任务
- Scheduled定时任务
Java中常见 3 种任务:
1. 在我们做项目时常常会用到邮件发送,比如说验证码,反馈用户信息等等,这时就会用到JMS邮件发送。
2. 而同步发送邮件,前台会一直响应直到邮件发送完成,这就给用户造成了很不好的使用体验,所以就需要使用到 Async 邮件异步发送,后台开启新的线程单独用于邮件发送,不会拖慢响应时间。
3. 关于定时任务,我们常常在凌晨需要自动保存昨天 redis 缓存库的数据或者更新一些数据,那么 Scheduled 定时任务就可以完成。这些其实SpringBoot都给我们提供了对应的支持,我们上手使用十分的简单,只需要开启一些注解支持,配置一些配置文件即可!那我们来看看吧~
(一)JMS邮件发送
1. Springboot 的邮件发送是非常简单的,只需要在 pom.xml 中导入 mail 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2. 在QQ邮箱电脑端开启 POP3/SMTP 服务,如下 :
设置==》账户==》往下翻,点击右边开启第一个服务 ==》点击生成授权码
3. 配置 yml 文件 如下:
spring:
mail:
default-encoding: UTF-8
host: smtp.qq.com(可以是 smtp.163.com 等等)
protocol: smtp
username: 自己的邮箱
password: 生成的授权码(注意:不是自己的QQ密码)
smtp:
auth: true
starttls:
enable: true
required: true
4. 下面是具体邮件发送代码:
//1. 发送简单文本邮件(为方便项目,下面是我写的工具类,后面直接在service中调用)
public void sendMail(String title, String content, String to, JavaMailSender mailSender){
String from="xxxxxx"; //自己发邮件的邮箱
try{
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(title);
helper.setText(content,true); //加上true表示可以附带html内容,不加则表示简单文本
try{
mailSender.send(message);
log.info("发送成功");
}catch (Exception es){
log.error("发送失败");
}
}catch (Exception e){
e.printStackTrace();
}
}
//调用
String title = "xxxx";
String to = users.getEmail();
String content = "恭喜你注册成功!<br>" + "为你生成的随机密码为: " + pwd + "<br><span>请记录好,以便下次密码登录。</span>";
sendEmail.sendMail(title, content, to, mailSender);
2.发送html邮件
public void sendHtmlMail(String to,String subject, String content,JavaMailSender mailSender) throws MessagingException {
String from="xxxx";
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from;
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
try{
mailSender.send(mimeMessage);
log.info("发送成功");
}catch (Exception es){
log.error("发送失败");
}
}
//调用
String title="xxxxxxxx";
String to=message1.getEmail();
//下面是html需要的数据
Context context = new Context();
context.setVariable("usernickname",message1.getNickname());
context.setVariable("usercontent",message1.getContent());
//结合Thymeleaf模板引擎,"hostToUser"是要发送的hostToUser.html文件
String process=templateEngine.process("hostToUser",context);
try {
sendEmail.sendHtmlMail(to,title,process,mailSender);
log.info("回复邮箱成功");
} catch (MessagingException e) {
e.printStackTrace();
log.error("回复邮箱失败");
}
(二)Aynsc 异步任务
1. 在启动类加上注解
@EnableAsync//开启异步注解功能
@EnableScheduling//开启定时任务注解功能
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. 在方法上加上注解(这里我就用异步发送邮件为例)
@Async
public void sendMail(String title, String content, String to, JavaMailSender mailSender){
String from="xxxx";
try{
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(title);
helper.setText(content,true);
try{
mailSender.send(message);
log.info("发送成功");
}catch (Exception es){
log.error("发送失败");
}
}catch (Exception e){
e.printStackTrace();
}
}
(三)定时任务
1. 定时任务的使用场景入戏下:
- 类似凌晨12点,定时执行日志输出
- 某一个时间点,定时举办商品折扣的互动弄
- 利用定时任务实现某一个时间点,执行某一个业务代码。
2. 注解:
- @EnableScheduling 表示:开启定时功能的注解(加在启动类Main()方法上)
- @Scheduled 表示:表示什么时候执行异步任务(里面涉及了:Cron表达式)
3. 使用:
@EnableAsync//开启异步注解功能
@EnableScheduling//开启定时任务注解功能
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
4. 在方法上使用:
* 1.1 Cron表达式
* -->Cron表达式从左到右分别表示:
* 秒 分 时 日 月 周几
* 1.2 Cron表达式讲解
* 30 15 10 * * ? ==》表示每天的10点15分30秒执行一次
* 30 0/5 10,18 * * ? ==》表示每天10点和18点,每隔五分钟执行一次
* 0 15 10 ? * 1-6 ==》每个月的周一到周六10点15分,执行一次
* 0 0 12 * * ? ==》每天中午12点执行一次
* 0 15 10 15 * ? ==》每个月15号的上午10点15分执行一次
* 0 15 10 L * ? ==》每个月最后一天的上午10点15分执行一次
* 0/2 * * * * ? ==》每隔两秒执行一次
* --->具体更多Cron执行的表达式可网上搜索!
@Service
public class ScheduledService {
@Scheduled(cron = "0/2 * * * * ?")
public void testScheduledTask(){
System.out.println("testScheduledTask,被执行了!");
}
}