一、异步任务

在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);
    }