SpringBoot - 异步任务、定时任务、邮件任务

异步任务

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。

注解使用

在SpringBoot里,需要给启动类添加@EnableAsync来开启异步注解。
使用@Async异步注解:

@Service
public class AsyncService {
    @Async       // 该注解表明这是一个异步任务
    public void hello(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("处理数据中...");
    }
}

同步任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,统计前一天的商品销量等。Spring为我们提供了异步执行任务调度的方式,提供TaskExecutorTaskScheduler接口。
要使用同步任务,首先需要了解SpringTask以及Cron表达式
cron表达式cron表达式

注解使用

在SpringBoot里,需要给启动类添加@EnableScheduling来开启定时任务注解。
使用@Scheduled定时任务注解:

@Service
public class ScheduleService {
    @Scheduled(cron = "0/4 * * * * MON-SAT")  //每4秒执行一次
    public void hello(){
        System.out.println("hello...");
    }
}

邮件任务

邮件任务在项目中也比较常见,比如用户注册,我们可以通过邮件的方式确认注册信息(验证码),注册成功了,发送一些有关的信息等等。

原理

[email protected]要给[email protected]发送邮件,它们不是直接交互的。而是lcy要登录自己的邮箱服务器,登进来以后以这个账户为名,给jyqc发邮件。而给jyqc发邮件,也是qq邮箱服务器发给163邮箱服务器,163邮箱服务器再发给jyqc的。
原理图

一、依赖引入及自动配置

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

自动配置
MailSenderAutoConfiguration
配置文件内容
MailProperties

二、开启邮箱服务

QQ邮箱为例,需要开启这些服务:
邮箱服务
然后我们就可以点击生成授权码,在yml配置文件中使用。

三、配置yml

主要需要配置邮箱的账号密码(授权码)邮箱主机地址

spring:
  mail:
    username: 123456789@qq.com    # 邮箱
    password: vzydizxcystfkwefi    # 授权码
    host: smtp.qq.com             # QQ邮箱主机地址
    default-encoding: utf-8       # 编码,默认UTF-8
    properties:
      mail:
        smtp:
          ssl:
            enable: true          # 安全的ssl链接

四、简单邮件发送

注入JavaMailSenderImpl

@Autowired
private JavaMailSenderImpl mailSender;

@Test
public void test(){
	// 简单邮件信息对象
	SimpleMailMessage message = new SimpleMailMessage();
	// 邮件标题
	message.setSubject("寻宝游戏注册验证码:");
	// 邮件内容
	message.setText("验证码:123456");
	// 邮件接收方
	message.setTo("[email protected]");
	// 邮件发送方
	message.setFrom("[email protected]");
	// 发送
	mailSender.send(message);
}

验证码

五、复杂邮件发送

@Test
public void test1(){
	try {
		// 复杂的消息邮件对象
		MimeMessage mimeMessage = mailSender.createMimeMessage();
		// 参数2:是否上传文件
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
		// 邮件标题
		helper.setSubject("寻宝游戏注册");
		// 设置内容 - 参数2:是否使用html格式
		helper.setText("<em style='color:red'>注册成功!请阅读附件!</em>",true);
		// 邮件接收方
		helper.setTo("[email protected]");
		// 邮件发送方
		helper.setFrom("[email protected]");

		//上传文件
		helper.addAttachment("1.jpg",new File("D:\\1.jpg"));
		helper.addAttachment("2.jpg",new File("D:\\2.jpg"));
		// 发送
		mailSender.send(mimeMessage);
	} catch (MessagingException e) {
		e.printStackTrace();
	}
}

发送成功

发布了100 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40885085/article/details/105041267
今日推荐