Springboot与任务-笔记
一、异步任务
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的,但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务。
其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。
两个注解:
- @Async : 在需要异步执行的方法上标注注解
- @EnableAsync : 在主类上标注开启异步任务支持
步骤 :
第一步 : 在springboot的入口类头添加 @EnableAsync 开启异步注解功能。
@SpringBootApplication
@EnableAsync // 开启异步注解功能
public class SpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplication.class, args);
}
}
第二步 : 在需要异步执行的方法上加上 @Async 实现异步执行。
通过controller调用service中的异步方法测试。
@Async
public void hello() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("处理数据中");
}
二、定时任务
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口。
两个注解:
- @Scheduled : 标注在执行的方法上,并制定cron属性
- @EnableScheduling : 标注在主类,开启对定时任务支持
@Service
public class ScheduledService {
/**
* second(秒), minute(分), hour(时), day of month(日), month(月), and day of week(周几).
* {@code "0 * * * * MON-FRI"}
*/
// @Scheduled(cron = "0 * * * * MON-FRI")
// @Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT") // 枚举
// @Scheduled(cron = "0-4 * * * * MON-SAT") // 区间
@Scheduled(cron = "0/4 * * * * MON-SAT") // 步长 从0秒启动,没4秒执行一次
public void hello() {
System.out.println("hello...");
}
}
cron表达式:
second(秒), minute(分), hour(时), day of month(日), month(月), day of week(周几)
举例 :
0 0/5 14,18 * * ? : 每天14点整,和18点整,每隔5分钟执行一次
0 15 10 ? * 1-6 :每个月的周一至周六10:15分执行一次
0 0 2 ? * 6L : 每个月的最后一个周六凌晨2点执行一次
0 0 2 LW * ? : 每个月的最后一个工作日凌晨2点执行一次
0 0 2-4 ? * 1#1 : 每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次;
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
second(秒) | 0-59 | , - * / |
minute(分) | 0-59 | , - * / |
hour(时) | 0-23 | , - * / |
day of month(日) | 1-31 | , - * ? / L W C |
month(月) | 1-12 | , - * / |
day of week(周几) | 0-7或SUN-SAT 0,7是SUN(即0、7代表周日,1-6代表周一到周六) | , - * ? / L C # |
特殊字符 | 代表含义 |
---|---|
,(逗号) | 枚举 |
- | 区间 |
* | 任意 |
/ | 步长 |
? | 日/星期冲突匹配 |
L | 最后 |
W | 工作日 |
C | 和calendar联系后计算过的值 |
# | 星期,4#2,第2个星期四 |
三、邮件任务
邮件发送需要引入spring-boot-starter-mail,Spring Boot自动配置MailSenderAutoConfiguration,我们可以通过定义MailProperties内容,在application.yml全局配置文件中配置,使用自动装配的JavaMailSender组件来进行邮件发送。
步骤:
1.首先导入spring-boot-starter-mail依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.全局配置文件中配置属性
spring.mail.username=邮箱账号
spring.mail.password=授权码
spring.mail.host=smtp.qq.com // 我使用qq邮箱
3.自动装配JavaMailSenderImpl对象
@Autowired
JavaMailSenderImpl mailSender;
4.1.简单的邮件发送
@Test
void contextLoads() throws MessagingException {
// 简单的邮件发送
SimpleMailMessage mailMessage = new SimpleMailMessage();
// 邮件设置
mailMessage.setSubject("标题通知-java学习安排");
mailMessage.setText("学无止境,欲速则不达");
mailMessage.setTo("xxx@163.com");
mailMessage.setFrom("xxx@qq.com");
mailSender.send(mailMessage);
}
4.2.复杂的邮件发送
- new MimeMessageHelper(message,true)
设置multipart=true,开启对内联元素和附件的支持 - helper.setText(“xxxx”,true) 设置 html=ture
即设置content type=text/html,默认为text/plain
@Test
void contextLoads() throws MessagingException {
// 创建一个复杂的消息邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setSubject("标题通知-java学习安排");
helper.setText("<b>学无止境</b><br>" +
"<span style = 'color:red'>欲速则不达</span>",
true); // 设置为true,则告诉他我写的是html
helper.setTo("xxx@163.com");
helper.setFrom("xxx@qq.com");
// 上传文件
helper.addAttachment("1.jpg", new File("C:\\...\\...\\...\\...\\21.png"));
helper.addAttachment("2.jpg", new File("C:\\...\\...\\...\\...\\2.png"));
mailSender.send(mimeMessage);
}
本文地址:https://blog.csdn.net/weixin_44414492/article/details/112003157