目录

springboot与任务

异步任务

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在 处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用 多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完 美解决这个问题。

两个注解:@EnableAysnc、@Aysnc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package com.eh.springboottask.service;

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

@Service
public class AsyncService {

    // 加上@Async注解 告诉Spring这是一个异步方法,spring会开一个线程调用这个方法
    @Async
    public void hello() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("处理数据中...");
    }
}

定时任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前 一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供 TaskExecutor 、TaskScheduler 接口。

两个注解:@EnableScheduling、@Scheduled

cron表达式:

http://img.cana.space/picStore/20201027121011.png

注意:

  • 是用于日和星期冲突匹配,两者只要有一个精确值,另一个就写
  • 星期中的0和7都代表周日
  • 4#2 第2个星期四

演示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.eh.springboottask.service;

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

@Service
public class ScheduledService {

    /**
     * second(秒), minute(分), hour(时), day of month(日), month(月), day of week(周几).
     * 0 * * * * MON-FRI
     *  【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点期间,每个整点都执行一次;
     */
   // @Scheduled(cron = "0 * * * * MON-SAT")
    //@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
   // @Scheduled(cron = "0-4 * * * * MON-SAT")
    @Scheduled(cron = "0/4 * * * * MON-SAT")  //每4秒执行一次
    public void hello(){
        System.out.println("hello ... ");
    }
}

邮件任务

完整示例地址

  • 邮件发送需要引入spring-boot-starter-mail

    1
    2
    3
    4
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    
  • Spring Boot 自动配置MailSenderAutoConfiguration

  • 定义MailProperties内容,配置在application.yml中

    一封邮件的发送流程如下:

    http://img.cana.space/picStore/20201027122752.png

    所以需要配置发件人的账号密码以及发件人所在邮箱服务器的地址,注意账号密码由于邮箱服务器都做了安全设置,需要开启服务生成授权码,配置文件中账号密码需要设置成该授权码。

    http://img.cana.space/picStore/20201027122205.png

    上面两个服务的授权码都是一样的,服务器地址看上图中下方提示,最终的配置如下:

    1
    2
    3
    4
    
    spring.mail.username=lienhui1992@yeah.net
    spring.mail.password=RFQRKKYMLDUTLPNV
    # 注意这里填写smtp服务器的密码
    spring.mail.host=smtp.yeah.net
    
  • 自动装配JavaMailSender

  • 测试邮件发送

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
    package com.eh.springboottask;
      
    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.internet.MimeMessage;
    import java.io.File;
      
    @SpringBootTest
    class SpringbootTaskApplicationTests {
      
        @Autowired
        JavaMailSenderImpl mailSender;
      
        /**
         * 测试简单邮件发送
         */
        @Test
        public void contextLoads() {
            SimpleMailMessage message = new SimpleMailMessage();
            //邮件设置
            message.setSubject("通知-今晚开会");
            message.setText("今晚7:30开会");
      
            message.setTo("892084947@qq.com");
            // 需要保证登录人邮箱跟发信人邮箱一致,否则会报:553 Mail from must equal authorized user
            message.setFrom("lienhui1992@yeah.net");
      
            mailSender.send(message);
        }
      
        /**
         * 测试复杂邮件发送
         * @throws Exception
         */
        @Test
        public void test02() throws Exception {
            //1、创建一个复杂的消息邮件
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
      
            //邮件设置
            helper.setSubject("通知-今晚开会");
            // 设置样式
            helper.setText("<b style='color:red'>今天 7:30 开会</b>", true);
      
            helper.setTo("892084947@qq.com");
            helper.setFrom("lienhui1992@yeah.net");
      
            //添加附件
            helper.addAttachment("1.jpg", new File("/Users/david/my/picture/1.jpg"));
            helper.addAttachment("2.jpg", new File("/Users/david/my/picture/2.jpg"));
      
            mailSender.send(mimeMessage);
        }
    }
    

    演示效果:

    http://img.cana.space/picStore/20201027124234.png