09_18_第七阶段:微服务开发||01-SpringBoot||17任务【观看狂神随笔】

任务(异步,定时,邮件)

异步任务~

  • 多线程来实现

定时任务~

  • timer
  • 表达式~

邮件发送~

  • 时间
  • pop3/SMTP服务

一、异步任务(async)

1.应用场景

​ 1. 发送邮件需要时间,开异步,让用户先收到已发送邮件的信息,然后另一个线程在发邮件的等候时间后发送成功

2.案例
  • 模拟一个定时3秒钟的延迟操作,然后显示ok到页面前延迟,现在:要让显示ok一个线程,延迟3秒另一个线程【如果不加就会先加载3秒后才出来ok字样,影响用户体验】
  1. 先写模拟代码

    • service包下的AsyncService
      
      @Service
      public class AsyncService {
      
      
          public void delay(){
              try {
                  Thread.sleep(3000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
      
              System.out.println("数据正在处理。。。");
          }
      }
      
    • controller包下的AsyncController
      
      @RestController
      public class AsyncController {
      
          @Autowired
          AsyncService asyncService;
      
          /*
          * 要实现的就是一个线程直接输出ok,另一个线程去做延迟3秒的操作【不影响用户体验】
          * */
          @RequestMapping("/delay")
          public String delay(){
              //调用这个方法就会延迟3秒钟,
              asyncService.delay();
              return "ok";
          }
      }
      
  2. 在delay方法上告诉Spring这是一个异步的方法

    • @Async注解】

    • 加了这个注解,只要程序运行就会给我们开启几个线程池

    • 需要在主方法中开启异步注解功能

    • service包下的AsyncService
      
      @Service
      public class AsyncService {
      
      	//在delay方法上告诉Spring这是一个异步的方法
      	@Async
          public void delay(){
              try {
                  Thread.sleep(3000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
      
              System.out.println("数据正在处理。。。");
          }
      }
      
  3. 一旦加了这个注解,就要在main方法中**【开启异步注解功能】**

    • @EnableAsync注解】

    • //开启异步注解功能
      @EnableAsync
      @SpringBootApplication
      public class Springboot09AsyncApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(Springboot09AsyncApplication.class, args);
          }
      
      }
      

二、邮件发送

1. 配置jar包

2.这里用qq发送
  1. qq邮箱的账户页面找到开启协议服务

在这里插入图片描述

  1. 会生成一个密码来代替自身明文密码

在这里插入图片描述

3.配置application.yaml
spring:
  mail:
    username: 834399035@qq.com
    #配置的动态密码
    password: kcsigtxaclybbfdj
    #配置发送的服务器
    host: smtp.qq.com
    # 设置开启ssl
    properties:
      mail:
        stmp:
          ssl:
            enable: true
         
    ##下面这些视情况开启
    # 协议 默认就是smtp
    #protocol: smtp
    #default-encoding: utf-8
    #port: 465
    # qq邮箱需要...开启邮箱验证
    #properties.mail.smtp.ssl.enable=true
    #port: 587
    
4.Test测试中写发送邮件的测试【这里先写到Test中,后面要写到controller或者service中】
@SpringBootTest
class Springboot09AsyncApplicationTests {

    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    void contextLoads() {

        //一个简单的邮件
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        //标题
        mailMessage.setSubject("你好");
        //内容
        mailMessage.setText("你电脑涉嫌窃取国家机密");
        mailMessage.setSentDate(new Date());
        //给送给谁
        mailMessage.setTo("496228526@qq.com");
        //从哪里发送
        mailMessage.setFrom("834399035@qq.com");

        javaMailSender.send(mailMessage);
    }

}
5.写一个复杂的邮件发送【这里先写到Test中,后面要写到controller或者service中】
@Test
    void contextLoads2() throws MessagingException {

        //一个复杂的邮件发送
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //组装(这里需要抛出异常)
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

        //正文
        helper.setSubject("你好g1x");
        helper.setText("一个复杂的邮件发送(加附件的)");

        //附件
        helper.addAttachment("2.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\2.jpg"));
        helper.addAttachment("3.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\3.jpg"));

        //发送
        helper.setFrom("834399035@qq.com");
        helper.setTo("834399035@qq.com");

        javaMailSender.send(mimeMessage);
    }

6.写成一个工具类【也就是写成一个方法】

    /**     *     * @param html  :第一个参数:是否支持多文本上传哪里true改为html     * @param subject   :标题     * @param text  :正文     * @throws MessagingException     * @Author g1x  :后面类比看自己需要     */    public void sendMail(Boolean html, String subject, String text) throws MessagingException {        //一个复杂的邮件发送        MimeMessage mimeMessage = javaMailSender.createMimeMessage();        //组装(这里需要抛出异常)        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, html);        //正文        helper.setSubject(subject);        helper.setText(text);        //附件        helper.addAttachment("2.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\2.jpg"));        helper.addAttachment("3.jpg", new File("E:\\pictureOrFilms\\picture\\dota\\3.jpg"));        //发送        helper.setFrom("834399035@qq.com");        helper.setTo("834399035@qq.com");        javaMailSender.send(mimeMessage);    }

三、定时任务

*两个核心的接口
TaskScheduler	//任务调度程序TaskExecutor	//任务执行者
1.主运行方法上要加的注解
@EnableScheduling	//开启定时的注解功能@Scheduled	//什么时候执行----------------------//开启异步注解功能@EnableAsync@SpringBootApplication//开启定时的注解功能@EnableSchedulingpublic class Springboot09AsyncApplication {    public static void main(String[] args) {        SpringApplication.run(Springboot09AsyncApplication.class, args);    }}
3.@Scheduled中使用cron表达式
  • 这个cron表达式可以在网上生成:https://cron.qqe2.com/

  • cron表达式也有很多例子:https://www.cnblogs.com/yanghj010/p/10875151.html

  • //Service层编写@Servicepublic class ScheduledService {    //cron 表达式    //秒 分 时  日 月 周几    //后面代表的是全部    @Scheduled(cron = "0 35 17 * * ?")    public void hello(){        System.out.println("hello,你被执行了!");    }}
    
4.总结:大数据开发中用到的比较多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂野小白兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值