• 10、springboot中的任务:异步任务、邮件发送、定时任务


    SpringBoot任务:

    一、异步任务:

    1、定义service

    @Service
    @Async
    public class SyncService {
        public void demo(){
            try {
                // 模拟网站延迟的情况
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("程序正在处理~");
        }
    }
    

    2、编写controller,在请求中调用service

    @Autowired
    SyncService syncService;
    @RequestMapping(
    "/test") public String test() { syncService.demo(); // 程序到这里会停止三秒 return "ok!"; }

    3、测试

      请求: localhost:8080/test  这里是模拟网站的延迟情况,如果延迟三秒钟,那么网站就会一直转圈圈,对于用户的体验很不好,所以:

    在Service的类上或者方法中使用 @Async ,并在主入口(启动类)上使用 @EnableAsync 开启异步任务,网页会很快刷新、

    二、邮件发送


    导入依赖:

    <!--邮件发送-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <!--thymeleaf模板引擎-->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-java8time</artifactId>
    </dependency>

    在properties中配置自己的邮件信息:

     1 spring.mail.username=1820712542@qq.com
     2 spring.mail.password=ehhtnaacqihleaai
     3 # 设置SMTP服务主机地址
     4 spring.mail.host=smtp.qq.com
     5 # QQ邮箱特别要设置的ssl加密规则
     6 spring.mail.properties.mail.smtp.ssl.enable=true
     7 # 默认编码(默认)
     8 spring.mail.default-encoding=utf-8
     9 # SMTP服务器使用的协议(默认)
    10 # spring.mail.protocol=smtp

    1、简单邮件发送

     // 邮件发件人
     @Resource
     JavaMailSenderImpl mailSender;
     @Test
     void test1() {
         SimpleMailMessage message = new SimpleMailMessage();
         // 设置邮件发件人
         message.setFrom("1820712542@qq.com");
         // 设置邮件收件人
         message.setTo("zhang_zhixi@qq.com");
         // 设置邮件主题
         message.setSubject("这是一封来自未来的邮件");
         // 设置邮件发送的内容
         message.setText("小伙纸,你能成大事~");
         // 发送
         mailSender.send(message);
     }
    

    2、复杂(附件)邮件发送

    // 邮件发件人
        @Resource
        JavaMailSenderImpl mailSender;
        
        @Test
        void test2() throws MessagingException, ParseException {
            // 复杂的邮件发送
            MimeMessage message = mailSender.createMimeMessage();
            // 组装(true:支持内联元素和附件*的多部分消息)
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
    
            // 设置邮件发件人
            helper.setFrom("1820712542@qq.com");
            // 设置邮件收件人
            helper.setTo(new String[]{"zhang_zhixi@qq.com"});
            // 设置邮件发送时间
            //helper.setSentDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-2-1 11:20:00"));
            // 设置邮件发送主题
            helper.setSubject("查收今天的第二封邮件~");
            // 正文
            helper.setText("<p style='color:red'>加油,干饭人!</p>", true);
            // 发送附件
            helper.addAttachment("demo.jpg", new File("C:\Users\华信彭于晏\Pictures\壁纸\demo.jpg"));
            // 发送
            mailSender.send(message);
        }
    

    3、表单提交邮件,实现发送

    表单信息:

    1 <form th:action="@{/email}" method="post">
    2     发送方邮件地:<input type="email" th:name="email"><br>
    3     收件方邮件地:<input type="email" th:name="toEmail"><br>
    4     邮件主题:<input type="text" th:name="subject"><br>
    5     邮件内容:<input type="text" th:name="text"><br>
    6     <input type="submit" th:value="提交">
    7 </form>

    controller发送请求:

     1 @Controller
     2 public class EmailSendController {
     3 
     4     @RequestMapping("/")
     5     public String toIndex() {
     6         return "index";
     7     }
     8 
     9     @Autowired
    10     JavaMailSenderImpl mailSender;
    11 
    12     @RequestMapping("/email")
    13     @ResponseBody
    14     public String toEmailSend(HttpServletRequest request) throws MessagingException {
    15         String email = request.getParameter("email");
    16         System.out.println(email);
    17         String toEmail = request.getParameter("toEmail");
    18         System.out.println(toEmail);
    19         String subject = request.getParameter("subject");
    20         System.out.println(subject);
    21         String text = request.getParameter("text");
    22         System.out.println(text);
    23 
    24         // 复杂的邮件发送
    25         MimeMessage message = mailSender.createMimeMessage();
    26         // 组装(true:支持内联元素和附件*的多部分消息)
    27         MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
    28 
    29         // 设置邮件发件人
    30         helper.setFrom(email);
    31         // 设置邮件收件人
    32         helper.setTo(toEmail);
    33         // 设置邮件发送主题
    34         helper.setSubject(subject);
    35         // 正文
    36         helper.setText("<p style='color:red'>" + text + "</p>", true);
    37 
    38         // 设置邮件发送时间
    39         //helper.setSentDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-2-1 11:20:00"));
    40         // 发送附件
    41         // helper.addAttachment("demo.jpg", new File("C:\Users\华信彭于晏\Pictures\壁纸\demo.jpg"));
    42 
    43         // 发送
    44         mailSender.send(message);
    45         return "邮件发送成功~可能有延迟,请稍后进行查看!";
    46     }
    47 }

     

     三、定时任务


    TaskScheduler     //任务调度程序
    TaskExecutor	   //任务执行者
    @EnableScheduling   //开启定时功能的注解,放在主入口
    @Scheduled	   //什么时候执行
    

     在方法上面加上@Scheduled(cron = "0 43 14 * * ?")并加上相应的cron表达式即可 

    cron表达式在线生成器

    常用表达式例子
    
      (1)0/2 * * * * ?   表示每2秒 执行任务
    
      (1)0 0/2 * * * ?    表示每2分钟 执行任务
    
      (1)0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务
    
      (2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业
    
      (3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作
    
      (4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 
    
      (5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 
    
      (6)0 0 12 ? * WED    表示每个星期三中午12点 
    
      (7)0 0 12 * * ?   每天中午12点触发 
    
      (8)0 15 10 ? * *    每天上午10:15触发 
    
      (9)0 15 10 * * ?     每天上午10:15触发 
    
      (10)0 15 10 * * ?    每天上午10:15触发 
    
      (11)0 15 10 * * ? 2005    2005年的每天上午10:15触发 
    
      (12)0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发 
    
      (13)0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发 
    
      (14)0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
    
      (15)0 0-5 14 * * ?    在每天下午2点到下午2:05期间的每1分钟触发 
    
      (16)0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发 
    
      (17)0 15 10 ? * MON-FRI    周一至周五的上午10:15触发 
    
      (18)0 15 10 15 * ?    每月15日上午10:15触发 
    
      (19)0 15 10 L * ?    每月最后一日的上午10:15触发 
    
      (20)0 15 10 ? * 6L    每月的最后一个星期五上午10:15触发 
    
      (21)0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发 
    
      (22)0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发
    

      

      

  • 相关阅读:
    Luogu P4316 绿豆蛙的归宿 题解报告
    Luogu P1850 换教室(NOIP 2016) 题解报告
    Rainbow的信号 题解报告
    $CH5105 Cookies$ 线性$DP+$贪心
    算法竞赛 $0×50$ 动态规划 (+一本通
    $CH5104 I-country$ 线性$DP$
    洛谷$2014$ 选课 背包类树形$DP$
    $SP703 Mobile Service DP$
    $POJ1015 Jury Compromise Dp$/背包
    $POJ1742 Coins$ 多重背包+贪心
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14354560.html
Copyright © 2020-2023  润新知