Springboot(十六)——异步任务、邮件任务、定时任务

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

异步任务

1、环境搭建

image

2、编写service层,实现延迟3000毫秒

package com.study.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {

    public void hello(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("数据正在处理。。。。");
    }
}

3、编写controller,调用service层

package com.study.controller;

import com.study.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AstncController {

    @Autowired
    AsyncService asyncService;

    @RequestMapping("/hello")
    public String hello(){
        asyncService.hello();//延迟三秒
        return "ok";
    }
}

运行测试

跳转到localhost:8080/hello 的时候会延迟(转圈)三秒
image

解决办法,在springboot中开启异步功能

1、在主启动类开启异步功能

@SpringBootApplication
@EnableAsync  //开启异步注解功能
public class Springboot09TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot09TestApplication.class, args);
    }
}

2、在service层方法中添加注解

@Service
public class AsyncService {

    //告诉spring这是一个异步的方法,执行这个方法的时候会自动开启线程池
    @Async
    public void hello(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("数据正在处理。。。。");
    }
}

3、运行测试

瞬间响应,进入到页面
image

邮件任务

发送和接收邮件

1、导入邮件依赖

<!--导入mail配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2、设置QQ邮箱,开启POP3/SMTP协议

进入QQ邮箱,点击设置
image

点击账户
image

点击开启POP3/SMTP协议
image

获取邮箱授权码
image

3、编写properties

# 应用名称
spring.application.name=springboot-09-test
# 应用服务 WEB 访问端口
server.port=8080

#邮箱名称
spring.mail.username=963330213@qq.com
#邮箱密码(授权码)
spring.mail.password=toxvosulbehkbcai
#发送的服务器
spring.mail.host=smtp.qq.com
#开启加密验证
spring.mail.properties.mail.smtl.ssl.enable=true

一个简单的邮件

4、编写测试类

package com.study;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@SpringBootTest
class Springboot09TestApplicationTests {

    @Autowired
    JavaMailSenderImpl mailSender;

    @Test
    void contextLoads() {
        //简单邮件
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();

        //邮箱标题
        simpleMailMessage.setSubject("邮件标题");
        //邮箱内容
        simpleMailMessage.setText("邮件内容");
        //接受邮件
        simpleMailMessage.setTo("963330213@qq.com");
        //发送邮件
        simpleMailMessage.setFrom("963330213@qq.com");
        mailSender.send(simpleMailMessage);
    }
}

5、运行测试

image

一个简单的邮件

编写测试类

@Autowired
JavaMailSenderImpl mailSender;

@Test
void contextLoads2() throws MessagingException {
    //复杂邮件
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    //组装
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

    //邮件标题
    helper.setSubject("邮件标题");
    //邮件内容
    helper.setText("<h1 style='color:red'>邮件内容</h1>",true);
    //附件
    helper.addAttachment("1.jpg",new File("C:\\Users\\Desktop\\1.jpg"));  //文件地址
    helper.addAttachment("2.jpg",new File("C:\\Users\\Desktop\\1.jpg"));
    //发送
    helper.setFrom("963330213@qq.com");
    //接收
    helper.setTo("963330213@qq.com");
    mailSender.send(mimeMessage);
}

运行测试

image

定时任务

1、在主启动类添加开启定时任务功能的注解

@SpringBootApplication
@EnableAsync  //开启异步注解功能
@EnableScheduling //开启定时功能
public class Springboot09TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot09TestApplication.class, args);
    }

}

2、编写service层,测试定时任务功能

@Service
public class ScheduledService {
    //@Scheduled : 什么时候执行
    //在一个特定时间执行这个方法:Timer
    //cron表达式        秒 分 时 日 月 星期 年(可选)
    // * :任意  ?:不确定   ,任意周用 ? 表示
    /*
        0 35 2 * * ?    每天凌晨2:35分执行
        0 0/5 10,18 * * ? 每天10点和18点,每隔5分钟执行一次
        0 15 10 ? * 1-6 每个月的周一到周六10点15分执行一次
     */
    //每隔两秒执行一次
    @Scheduled(cron = "0/2 * * * * ?")
    public void hello(){
        System.out.println("hello被执行了");
    }
}

3、运行测试

image

4、在线生成Cron表达式

https://www.bejson.com/othertools/cron/

posted @ 2021-07-06 00:24  转身刹那的潇洒  阅读(64)  评论(0编辑  收藏  举报