异步任务
首先是我们要先在主程序上开启异步
@EnableAsync
同理我们要在某个地方添加
@Aync
service
@Service
@Async
public class AsyncService {
public void as() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("数据正在处理");
}
}
controller
这样我们在访问/hello路径的时候就不会有三秒的延迟效果
@RestController
public class AsyncController {
@Resource
private AsyncService asyncService;
@RequestMapping("/hello")
public String as(){
asyncService.as();
return "ok";
}
}
邮箱任务
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
application.yml
spring:
mail:
username: 邮箱
password: 授权码
host: smtp.qq.com #这里使用的是qq服务器
port: 465 # 端口号
properties:
mail:
smtp:
ssl:
enable: true # 开启安全连接
核心类
@Autowired
private JavaMailSender mailSender;//此类是java的核心类
@Test //简单邮箱的发送
void contextLoads() {
SimpleMailMessage mailMessage = new SimpleMailMessage();// 创建一个简单的邮箱
mailMessage.setSubject("设置主题");
mailMessage.setText("你好,正文");
mailMessage.setFrom("2331890842@qq.com");
mailMessage.setTo("2331890842@qq.com");
mailSender.send(mailMessage);
}
@Test //复杂邮箱的发送 就是带有附件的邮箱
void send() throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();//先创建一个邮箱信心
//创建一个帮助类 将创建好的邮箱模板传入 开启负载模式 设置编码
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true,"utf-8");
mimeMessageHelper.setSubject("设置主题");
//添加附件 有多种形式 这里是直接使用文件的形式创建
mimeMessageHelper.setText("正文");mimeMessageHelper.addAttachment("chameleon.jpg",new File("C:\\Users\\quxianwei\\Desktop\\chameleon.jpg"));
mimeMessageHelper.setFrom("2331890842@qq.com");
mimeMessageHelper.setTo("2331890842@qq.com");
mailSender.send(mimeMessage);
}
定时任务
同样首先是开启定时任务
@EnableScheduling
同样他也会有一个
@Scheduling
我们在service层进行演示,通过注解进入源码我们可以看出核心是cron的一种表达式,我们还可以使用一些其他的属性来代替。
@Scheduled(cron = "0/3 * * * * ?")//每三秒执行一次
public void asd(){
System.out.println("当前执行的时间"+new Date());
}
cron表达式的规则
在线生成规则
特殊字符
取值示例
如果当我们设置多个定时任务他可能会出现异步的问题,这样我们就需要开启异步注解,这样他们才不会因为异步而导致时差让定时任务不能准确执行。
@Service
@Async
public class AsyncService {
@Scheduled(cron = "0/3 * * * * ?")//每三秒执行一次
public void asd(){
System.out.println("当前执行的时间"+new Date());
}
@Scheduled(cron = "30,40 54,56 * * * ?")//分别在54,56分的30,40秒执行一次
public void asd1(){
System.out.println("54分执行开始"+new Date());
}
@Scheduled(cron = "0 13-15 9 * * ?") //在每天9. 13-15之间每一分钟执行一次
public void asd2(){
System.out.println("13-15分执行开始"+new Date());
}
}