Springboot中异步任务,邮件任务,定时任务简析

一、异步任务

测试

1、在服务层编写一个测试方法,使线程休眠三秒,用于模拟任务提交的时间,

​ 并在方法上面声明@Async注解,指明这是一个异步方法

@Service
public class AsyncService {

    //让spring知道这是一个异步方法
    @Async
    public void hello(){
        try {
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("数据正在处理中。。。。。");
    }

}

2、编写一个线程控制类,调用服务层的方法

@RestController
public class AsyncController {

    @Autowired
    AsyncService service;

    @RequestMapping("hello")
    public String hello(){
        service.hello();//停止三秒
        return "Ok";
    }
}

3、在主方法上面添加@EnableAsync注解开启异步任务

//开启异步任务注解
@EnableAsync
@SpringBootApplication
public class Springboot09TestApplication {

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

二、邮件任务

实例测试

1、引入依赖,spring-boot-starter-mail是基于Jakarta Mail API

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

2、开启邮箱中的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启一个即可,得到一个密码

​ QQ邮箱的位置为:设置->账户

​ 163邮箱位置:设置->POP3/SMTP/IMAP

3、在配置文件中配置账号密码

spring.mail.username=xxxxxx@qq.com		//邮箱
spring.mail.password=qgriunbjkfrdbdef		//步骤二获取的密码
spring.mail.host=smtp.qq.com		//smtp协议声明

# 开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true

4、简单的纯文本邮件任务流程:

​ (1)声明JavaMailSenderImpl实例

​ (2)new一个SimpleMailMessage对象

​ (3)设置邮件的标题,内容,收件人,发件人

​ (4)使用JavaMailSenderImpl实例发送

	@Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    void contextLoads() {

        //一个简单的邮件任务
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("你好啊,这个美丽的世界");      //邮件标题
        message.setText("这是一个邮件任务测试消息");        //邮件内容

        message.setTo("xxxxxxxxx@qq.com");     //收件人
        message.setFrom("**********@qq.com");        //发件人

        javaMailSender.send(message);
    }

5、声明一个复杂的邮件任务,可以进行文字的样式修改,发送图片,发送附件等

​ (1)声明JavaMailSenderImpl实例

​ (2)使用JavaMailSenderImpl实例创建一个复杂的邮件

​ (3)创建一个帮助类

​ (4)使用帮助类对象设置邮件的标题,内容,附件,收件人,发件人

​ (5)使用JavaMailSenderImpl实例发送

@Autowired
    JavaMailSenderImpl javaMailSender;

	@Test
    void contextLoads2() throws MessagingException {

        //一个复杂的邮件任务
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //组装
        //MimeMessageHelper(mimeMessage, 是否多文件)
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

        helper.setSubject("测试");
        
        //setText("文件内容","是否开启html支持")
        helper.setText("这是一条复杂的邮件测试任务<img src='https://th.bing.com/th/id/R586ee0f0e499f1d119d91572e4df675f?rik=66f7ePWJTdcmNA&riu=http%3a%2f%2fwx3.sinaimg.cn%2flarge%2f61f1701fgy1fs4087kpl2j20ku0v9tuo.jpg&ehk=Mda1mcH9Jm3e0ZPQqbTqUMWYXQipSHe79J%2bJ88oQ5m4%3d&risl=&pid=ImgRaw'/>",true);

        //附件
        helper.addAttachment("111.jpg",new File("F:\\IdeaProjects\\Spring-Project\\springboot-09-test\\src\\main\\resources\\static\\img\\111.jpg"));

        helper.setTo("xxxxxxxxx@qq.com");
        helper.setFrom("**********@qq.com");

        javaMailSender.send(mimeMessage);
    }

JavaMailSenderImpl的几个属性设置说明如下:

​ Host:邮箱服务器主机。

​ Port:端口号。

​ Username:发件方账户。

​ Password:密码,qq邮箱的话此处设置16位授权码,不是邮箱密码,切记!

​ mail.smtp.auth:认证机制开关,记得开启。

​ mail.smtp.starttls.enable:TLS通讯协议开关,连接qq的SMTP服务器,需使用此通讯协议。

​ mail.smtp.timeout :连接超时时间,单位毫秒。

​ 发送文本消息用SimpleMailMessage类

它的几个重要属性说明如下:

​ From:发件方的账户,和Username的值相同

​ To:收件方

​ Subject:邮件主题

​ Text:邮件内容

三、定时任务

主要组成

Taskscheduler 任务调度者

TaskExecutor 任务执行者

@@EnableScheduling //开启定时功能的注解

@Scheduled //什么时候执行

示例:

(1)在主方法上开启定时任务支持

//开启定时任务注解
@EnableScheduling

@SpringBootApplication
public class Springboot09TestApplication {

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

(2)编写一个服务,并在方法上面添加cron表达式

@Service
public class ScheduledService {

    //在一个特定的时间执行这个方法 Timer
    
    /*
        cron = "0 57 16 * * ?"  每天的16:57:00执行
        cron = "0 57 16 ? * 1-5"  每周1-5的16:57:00执行
     */
    @Scheduled(cron = "0 57 16 * * ?")
    public void hello(){
        System.out.println("hello,在一个特定的时间,你被执行了");
    }
}

cron表达式

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

  (1) Seconds Minutes Hours DayofMonth Month DayofWeek Year

  (2)Seconds Minutes Hours DayofMonth Month DayofWeek

一、结构

  corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

二、各字段的含义

注意事项:

  每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:

(1):表示匹配该域的任意值。假如在Minutes域使用, 即表示每分钟都会触发事件。

(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用,如果使用表示不管星期几都会触发,实际上并不是这样。

(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次

(4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.

(5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。

(6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。

(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。

(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

(9)#:用于确定每个月第几个星期几,只能出现在DayofWeek域。例如在4#2,表示某月的第二个星期三。

三、常用表达式例子

Contab表达式 说明
0 */1 * * * ? 每隔1分钟触发一次
0 0 5-15 * * ? 每天5:00~15:00整点触发
0 0/3 * * * ? 每隔3分钟触发一次
0 0-5 14 * * ? 每天14:00~14:05期间每隔1分钟触发一次
0 0/5 14 * * ? 每天14:00~14:55期间每隔5分钟触发一次
0 0/5 14,18 * * ? 每天14:0014:55和18:0018:55两个时间段内每5分钟触发一次
0 0/30 9-17 * * ? 每天9:00~17:00内每半小时触发一次
0 0 10,14,16 * * ? 每天10:00、14:00和16:00触发
0 0 12 ? * WED 每周三12:00触发
0 0 17 ? * TUES,THUR,SAT 每周二、周四、周六17:00触发
0 10,44 14 ? 3 WED 每年3月的每周三的14:10和14:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0 23 L * ? 每月最后一天23:00触发
0 15 10 L * ? 每月最后一天10:15触发
0 15 10 ? * 6L 每月最后一个周五10:15触发
0 15 10 * * ? 2005 2005年的每天10:15触发
0 15 10 ? * 6L 2002-2005 2002年~2005年的每月的最后一个周五上午10:15触发
0 15 10 ? * 6#3 每月的第三个周五10:15触发

另附一个在线cron表达式生成器:https://cron.qqe2.com/

声明:

​ 本文为,学习时编写,参考b站狂神说,链接地址:https://www.bilibili.com/video/BV1PE411i7CV

posted @ 2021-03-05 17:33  憨憨守护者  阅读(97)  评论(0)    收藏  举报