springboot(2.1.5)与任务方法的相关内容(异步任务,简单定时任务,邮箱任务)

1、 异步任务

单个用户进行请求的时候对任务进行异步处理
对于初学者来说,多个用户对一个controller进行请求会堵塞吗?
这个需要理解web中的 顾虑器,拦截器以及转发器的应用才能解答,这里按揭不表
1. 需要开启@EnableAsync
2. 在同步方法上添加注解 @Async
    见项目 aysnc
    可以不用等待就能返回结果

2、 简单定时任务(后续增加quartz任务)

定时任务,使用@Scheduled 任务
1. @EnableScheduling 开启定时任务
2. 在方法上使用 @Scheduled
3. 学习表达式
  • 0 * * * * MON-FRI # 星期一到星期五 每次的0秒执行一次

  • 0,1,2,3,4 * * * * MON-FRI # 星期一到星期五 每次的0,1,2,3,4秒都执行一次

     等效于 **0-4 * * * * MON-FRI**
    
    @Scheduled(cron = "0,1,2,3,4 * * * * MON-FRI")
    public void hello() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "hello。。。。");
        }
    }
    =========》  只执行了两次,一次是0秒的时候等待3秒之后执行的一次,第二次为第3 秒的时候执行一次
    =========》 并不会在0 1 2 3 4 秒均执行一次
    2019-06-17 15:46:03hello。。。。
    2019-06-17 15:46:07hello。。。。

========= 如何解决上面的问题? ==============

使用异步任务解决

    @Async
    @Scheduled(cron = "0,1,2,3,4 * * * * MON-FRI")
    public void hello() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "hello。。。。");
        }
    }
     =========》 并会在0 1 2 3 4 秒均执行一次
     2019-06-17 15:49:03hello。。。。
     2019-06-17 15:49:04hello。。。。
     2019-06-17 15:49:05hello。。。。
     2019-06-17 15:49:06hello。。。。
     2019-06-17 15:49:07hello。。。。
  • / 间隔步长
    0/4 * * * * MON-FRI 在星期一☞星期五 每隔4秒执行一次

  • ? 当日 (第四个参数)、 星期(第六个参数) 冲突的时候使用?来避免冲突,类似于*

    * * * ? * MON 在第四个参数中不能用 * ,因为不是每天都是星期一 ,所以使得日失效
    * * * 1 * ? 在表明每月1号执行任务的时候,第六个参数也要使用?
    
  • SUN-SAT 周日到周六 在 springboot的内置定时任务中 0与7代表星期日, 1,2,3,4 分别代表相应的星期
    Quartz[1-7 中 1代表周日] 不一样,需要区别待遇,也就是说springboot内置的更人性化国际化

练习题

  • 【 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点的整点执行一次 (4#2 代表第二个星期四)

3、 邮件任务

a) 引入依赖
官网地址
spring 邮箱官网

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

b) 配置邮箱的账户和密码
自动配置属性 application.properties

[email protected]
# 密码需要自己在第三方登录QQ邮箱,可能存在邮件泄露风险,甚至危害Apple ID安全,建议使用QQ邮箱手机版登录。
# 继续获取授权码登录第三方客户端邮箱 。 生成授权码
spring.mail.password=xxxx
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.smtp.ssl.enable=true

c) 测试发送邮箱

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTestMail {
    @Autowired
    JavaMailSender javaMailSender;
    @Test
    public void contextLoads() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("通知");  // 标题
        message.setText("今晚7:30开会"); // 内容
        message.setTo("[email protected]"); // 接收方
        message.setFrom("[email protected]"); // 来自于哪里,必须要与发送方一致
        javaMailSender.send(message);
    }
}

本项目github代码地址

springboot idea 热部署小技巧
如果配置了devtool依赖,那么在开启项目之后,修改源代码再ctrl+F9就可自动编译热部署了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章