文章目录

  • Spring Boot——完成异步任务,定时执行任务以及邮件发送任务
  • 1、异步任务
  • 2、邮件发送任务
  • 3、定时执行任务


Spring Boot——完成异步任务,定时执行任务以及邮件发送任务

1、异步任务

根据Spring的文档说明,默认采用的是单线程的模式的。所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的。那么当多个任务的执行势必会相互影响。例如,如果A任务执行时间比较长,那么B任务必须等到A任务执行完毕后才会启动执行。又如在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring3.x之后,已经内置了@Async来完美解决这个问题。

  • 异步调用:接收到指令就执行,无需等待
  • 同步调用:顺序执行,需等待上一个任务执行完毕

启动类加上注解:@EnableAsync

@EnableAsync//开启异步功能
@SpringBootApplication
public class Springboot09TaskApplication {

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

}

异步执行的方法上加上**@Async**注解

@Service
public class AsyncService {
    @Async//告诉springboot这是一个异步方法,可以在注解内加上自定义的线程池,不加就使用默认的
    public void hello(){

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正在加载。。。。。");
    }
}

controller执行异步方法

@RestController
public class AsyncController {
    @Autowired
    AsyncService asyncService;

    @RequestMapping("/hello")
    public String hello(){
        asyncService.hello();//延迟3秒
        return "hello";//响应‘hello’
    }
}

在不使用异步注解时,页面要转三秒才能响应‘hello’,然后再输出"正在加载。。。。。",

使用异步注解后,页面先响应‘hello’,三秒后再输出"正在加载。。。。。",说明这两个操作异步执行了。

2、邮件发送任务

进入邮箱–设置–账户–开启服务–POP3/SMTP

springschedule定时任务手动执行 spring 定时任务不执行_spring boot

导入发送邮件模块

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

在配置文件中配置邮件相关信息

=dpmipvyksstldejap.qq.com
#开启加密验证功能
spring.mail.properties.mail.smtp.ssl.enable=true

在测试类中测试邮件发送功能

package com.cheng;

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.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

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

@SpringBootTest
class Springboot09TaskApplicationTests {

    //Spring提供了非常好用的JavaMailSender接口实现邮件发送
    @Autowired
    JavaMailSender javaMailSender;

    @Test
    void contextLoads() {

        //一封简单的邮件
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        //邮件主题
        simpleMailMessage.setSubject("万里顾一程,你好");
        //邮件内容
        simpleMailMessage.setTssage);
    }

    @Test
    void contextLoads2() throws MessagingException {

        //一封复杂的邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //组装 , true开启多文件支持
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
        //正文
        helper.setSubject("万里顾一程,你好");
        helper.setText("<h1 style='color:red'>这是发给万里顾一程的邮件,本人亲启</h1>",true);//true:支持解析成html格式
        //添加附件,绝对地址
        helper.addAttachment("wanli.jpg",new File("C:\\Users\\Administrator\\Desktop\\4.16.png"));
        //邮件发给谁ssage);
    }

}

3、定时执行任务

在主启动类上添加注解

@EnableScheduling//开启定时执行任务的功能

定时执行的方法加注解 @Scheduled:

//秒 分 时 日 月 周几
    @Scheduled(cron = "*/2 * * * * ?")//cron表达式:每隔2秒执行一次
    public void hello(){
        System.out.println("已发送");
    }

CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表。

Cron语法格式,共7个部分(域)组成:最后一个不常用,所以一般都是六个部分

  • Seconds(秒) Minutes(分钟) Hours(小时) DayofMonth(天/几号) Month(月) DayofWeek(星期几) Year(年)
  • 每一个域可出现的字符如下:
  • Seconds:可出现", - * /",有效范围为0-59的整数
  • Minutes:可出现", - * /",有效范围为0-59的整数
  • Hours:可出现", - * /",有效范围为0-23的整数
  • DayofMonth(天/几号):可出现", - * / ? L W C",有效范围为0-31的整数
  • Month:可出现", - * /",有效范围为1-12的整数
  • DayofWeek(星期几) :可出现", - * / ? L C #",有效范围为1-7的整数或SUN-SAT(星期天开始)两个范围,其中1
  • Year:可出现", - * /"

下面是一些常用的Cron表达式例子: 注:dayofweek 和 dayofmouth必须有一个为?

  1. 每隔10秒执行一次:*/10 * * * * ?
  2. *每隔10分钟执行一次:0 /10 * * * ?
  3. 每天10点执行一次:0 0 10 * * ?
  4. 每月1号凌晨1点执行一次:0 0 1 1 * ?
  5. 每月最后一天10点执行一次:0 0 10 L * ?
  6. 每周星期天凌晨1点执行一次:0 0 1 ? * L
  7. 在26分、28分、30分执行一次:0 26,28,30 * * * ?
  8. 0 * 15 * * ? 每天下午15点钟开始到15点59分结束这么一个时间段
  9. 0 0/5 15 * * ? 每天下午15点到15点55分之间每5分钟触发一次
  10. 0 0/5 15,18 * * ? 每天下午15点到15点55分 和18点到18点55分之间 每5分钟触发一次
  11. 0 0-5 15 * * ? 每天下午15点开始到15点05结束
  12. 0 10,30 15 ? 3 WED 每年三月份的每个周三下午15点10分和15点30各一次
  13. 0 15 10 ? * MON-FRI 每个工作日的10点15分
  14. 0 15 10 15 * ? 每个月15号的上午10点15分
  15. 0 15 10 L * ? 每个月最后一天的10点15分
  16. 0 15 10 ? * 6L 每个月最后一个周五的10点15分
  17. 0 15 10 ? * 6L 2002-2005 2002年到2005年每个月最后一个周五的10点15分
  18. 0 15 10 ? * 6#3 每个月的第三个周五的10点15分
  19. 0 0 12 1/5 * ? 每个月从第一天开始每隔5天中午12点触发一次
  20. 0 11 11 11 11 ? 每年11月11号11点11分