1. 异步任务
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。要想使该注解生效,需要在启动类上加上注解@EnableAysnc。
简单使用:
1.1 service
在需要异步执行的方法上加上注解@Async
@Service
public class TaskService {
@Async
public void hello(){
try {
Thread.sleep(5000);
} catch (Exception e){}
System.out.println("正在处理数据。。。");
}
}
1.2 controller
@RestController
public class TaskController {
@Autowired
private TaskService taskService;
@GetMapping("/hello")
public String hello(){
taskService.hello();
return "success";
}
}
1.3 启动类
在启动类上加上注解@EnableAysnc
@SpringBootApplication
@EnableAsync
public class Springboot04TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot04TaskApplication.class, args);
}
}
在浏览器访问,页面很快出现success,但是控制台5s之后才打印“正在处理数据。。。”,说明程序是异步执行的。
2. 定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口。
spring也为我们提供了很简便的定时任务的支持,只需要2个注解@EnableScheduling、@Scheduled即可,在主启动类上启动定时任务@EnableScheduling,在需要定时执行的方法上添加注解@Scheduled并写cron表达式。
2.1 service
@Service
public class ScheduledService {
/*
* 表示每个周一-周天的整秒执行
* */
@Scheduled(cron="0 * * * * 0-6")
public void test(){
System.out.println("定时任务开始执行。。。");
}
}
2.2 启动类上添加注解@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class Springboot04TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot04TaskApplication.class, args);
}
}
启动程序,每当整秒的时候,service方法执行一次。
3. 邮件任务
3.1 引入mail启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3.2 配置发件人信息
# 邮箱服务器地址
spring.mail.host=smtp.163.com
# 邮箱授权码
spring.mail.password=GGCTEDQDVLKPCIID
# 发件人邮箱
spring.mail.username=13026336905@163.com
这些配置怎么来的了?我们知道boot通过大量的自动配置来简化开发,所以对于mail来说,也有一个与之对应的自动配置类MailSenderAutoConfiguration,在该类中使用的配置类是MailProperties,在MailProperties中,定义了大量的邮件相关的属性
private static final Charset DEFAULT_CHARSET;
private String host;
private Integer port;
private String username;
private String password;
private String protocol = "smtp";
private Charset defaultEncoding;
private Map<String, String> properties;
private String jndiName;
其中有一个protocol属性值默认为smtp,所以我们发件人邮箱服务器也是用smtp服务器地址。
3.3 测试
在MailSenderPropertiesConfiguration配置类中注入了一个邮件收发器对象JavaMailSenderImpl,该对象可用用于邮件的相关操作
3.3.1 发送简单邮件
@SpringBootTest
class Springboot04TaskApplicationTests {
@Autowired
private JavaMailSenderImpl sender;
@Test
void contextLoads() {
SimpleMailMessage simpleMesseage = new SimpleMailMessage();
// 设置主题
simpleMesseage.setSubject("通知");
// 设置正文
simpleMesseage.setText("今天休息!");
// 设置发件人
simpleMesseage.setFrom("13026336905@163.com");
// 设置收件人
simpleMesseage.setTo("553689287@qq.com");
simpleMesseage.setSentDate(new Date());
sender.send(simpleMesseage);
}
}
注意:如果邮件发送报530 SLL错误,这是说该邮件服务器是一个安全连接,这时候我们需要配置SSL开启
# 开启SSL
spring.mail.properties.mai.smtp.ssl.enable=true
3.3.2 发送MIME邮件
发送MIME邮件可以借助MimeMessageHelper来设置邮件内容
@Test
public void mail() throws Exception {
// 创建Mime消息对象
MimeMessage mimeMessage = sender.createMimeMessage();
// 创建helper对象并使用helper对象设置邮件信息
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
// 添加附件
helper.addAttachment("2019阿里.pdf",new File("F://2019阿里最新Java编程规范.pdf"));
helper.addAttachment("AngularJS 中文API参考手册.chm",new File("F://AngularJS 中文API参考手册.chm"));
// 设置发件人
helper.setFrom("13026336905@163.com");
// 设置收件人
helper.setTo("553689287@qq.com");
// 设置主题
helper.setSubject("通知");
// 设置邮件文本类型 true表示开启html解析
helper.setText("<span style='color:red;'><b>今天休息</b></span>",true);
sender.send(mimeMessage);
}
运行结果: