SpringBoot与任务

异步任务

异步任务非常简单,在执行发送邮件或者其他比较耗费时间的任务时,我们希望快速的去响应用户而不是让用户等待,那么就可以开启异步任务,让发送邮件跟响应用户同时去做

使用异步任务非常简单,只需要两个注解:@EnableAsync@Async

1、@EnableAsync标注在主程序类上,表示开启异步任务:

@EnableAsync
@SpringBootApplication
public class TaskApplication {

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

2、在要执行异步的方法上标注上@Async,就会开启一个新的线程去执行

@GetMapping("/hello")
public String hello(){
    asyncService.hello();  // 在这里会开启一个新的线程执行
    return "success";
}

asyncService:
@Async
public void hello() {
    ...
}

做完这两步,该方法就可以异步执行了

定时任务

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

两个注解:@EnableScheduling@Scheduled

@EnableScheduling标注在主程序类上,表示开启定时任务

@EnableScheduling
@SpringBootApplication
public class TaskApplication {

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

@Scheduled标注在要执行定时任务的方法上

// 0 * * * * MON-SAT表示周一到周六每一分钟都执行一次这个方法
@Scheduled(cron = "0 * * * * MON-SAT")
public void hello(){
    System.out.println("hello...");
}

做完上面两步就可以定时执行该方法了

只是定时的规则是什么呢?这就不得不提到cron表达式了

cron表达式

在标注@Scheduled注解的时候要使用cron表达式来表示隔多久执行一次任务,那么这个表达式怎样写呢?

首先,表达式各个位置上代表的信息是: 周几

字段介绍

字段

允许值

允许特殊字符

0-59

, - * /

0-59

- * /

小时

0-23

- * /

日期

1-31

, - * / L W C

月份

1-12

, - * /

星期

0-7SUN-SAT

, - * ? / L C #

 

 

 

 

 

 

 

 

 

 

 

 

 

 

字符介绍

特殊字符

代表含义

例子

,

枚举

0,1,2,3 * * * *MON-SAT

表示每分钟的第01,2,3秒都执行

-

区间

0-3 * * * * MON-SAT

表示04秒每一秒都执行

*

任意

 

 

/

步长

0/4 * * * * MON-SAT

表示从0秒启动,每4秒执行一次

?

/星期冲突匹配

0 * * ? * MON

因为在星期的地方写了每周一都执行一次,但是在日期的地方就不能写*,因为不是每天都是周一,因此用?匹配

L

最后

0 0 2 LW * ?

表示每个月最后一个工作日的凌晨两点执行一次

W

工作日

 

 

C

calendar联系后计算过的日期

 

 

#

星期,4#2表示第二个星期四

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

邮件任务

  • 邮件发送需要引入spring-boot-starter-mail
  • Spring Boot自动配置MailSenderAutoConfiguration
  • 定义MailProperties内容,配置在application.yml
  • 自动装配JavaMailSender
  • 测试邮件发送

1、引入依赖

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

2、配置邮件相关信息,注意,密码填写授权码

spring:
  mail:
    username: 2789519045@qq.com
    password: fjkmnzgjgwhwdfjc    # 邮箱授权码
    host: smtp.qq.com
    properties:
      mail:
        smtp:
          ssl:
            enable: true     # 开启ssl安全连接

3、测试邮件发送

@Autowired
JavaMailSenderImpl javaMailSender;

@Test
public void contextLoads() {
    SimpleMailMessage message = new SimpleMailMessage();
    // 设置邮件信息
    message.setSubject("今晚打球不");
    message.setText("今晚8点去打球");
    message.setTo("2968626690@qq.com");
    message.setFrom("2789519045@qq.com");
    // 发送
    javaMailSender.send(message);
}

发送复杂邮件(支持HTML跟发送文件)

@Autowired
JavaMailSenderImpl javaMailSender;

@Test
public void test() throws MessagingException {
    // 创建一个复杂邮件
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    // 参数一:MimeMessage
    // 参数二:是否发送文件
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    // 设置邮件信息
    helper.setSubject("今晚打球不");
    helper.setText("<b style='color: red;'>今晚8点去打球</b>", true);    // 参数二:允许html
    // 上传文件
    helper.addAttachment("1.jpg", new File("G:\\壁纸\\1.jpg"));
    helper.addAttachment("2.jpg", new File("G:\\壁纸\\2.jpg"));
    helper.setTo("2968626690@qq.com");
    helper.setFrom("2789519045@qq.com");
    // 发送
    javaMailSender.send(mimeMessage);
}

 

posted @ 2018-09-20 09:26  Jin同学  阅读(122)  评论(0编辑  收藏  举报