zoukankan      html  css  js  c++  java
  • SpringBoot日记——任务处理 之 异步、定时、邮件

    ---恢复内容开始---

      直接步入正题。

    异步任务

      异步任务比较简单,只需要两个注解就可以搞定,我们直接来看如何使用:

      1、创建一个service,带上@EnableAsync,就是开启异步任务的注解模式。

      2、在需要异步处理的方法前加上注解@Async,该方法就会按照异步处理了。

    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.stereotype.Service;
    
    @EnableAsync
    @Service
    public class AsyncService {
    
        @Async
        public void asynv() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("数据处理中……");
        }
    }

      那如何来证明我们的异步处理是可以的呢?

      1、写一个controller,我们浏览器中访问一下之前没有加注解的页面,应该是需要等待3秒,才有相应返回success的;

      2、加上异步处理的注解,我们再次访问,就会发现,相应变的很快了;这就是异步处理任务成功了。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class AsyncController {
    
        @Autowired
        AsyncService asyncService;
    
        @GetMapping("/hello")
        public String hello() {
            asyncService.asynv();
            return "success";
        }
    
    }

    定时任务

      定时任务在平时的工作中,经常被用到,比如日志处理、或者每天凌晨进行自动化脚本、或者每月生成报表之类的。

      同样只需要了解两个注解就可以了。

      我们来创建一个service看下(执行主程序,你会发现,每到0秒的时候就会打印一个hello):

    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    
    @EnableScheduling
    @Service
    public class ScheduledService {
    
        /**
         * minute, hour, day of month, month, day of week
         * 格式:"0 * * * * 1-5"
         * 说明:举例的格式表示周一到周五的每分钟整,如果把0换成*就是每周一到周五的每秒处理任务了
         *
         * 其他:处理具体值,这个式子中还支持一些特殊符号,比如:
         *      , 表示 枚举。 1,2,3,4 表示每分钟的1,2,3,4秒的时候执行
         *      - 表示 区间。 0-4就是0到4秒之间,每秒执行,同上边
         *      * 表示 任意。 每的意思
         *      ? 表示 日/星期冲突匹配。 比如我们设置了mon,又设置了每天。那么为了匹配,我们要把*换成?
         *      / 表示 步长。 0/4就是每4秒执行一次
         *      L 表示 最后。
         *      W 表示 工作日。
         *      C 表示 和calendar联系并计算后的值。
         *      # 表示 星期,4#2就是第二个星期四。
         */
        @Scheduled(cron = "0 * * * * 1-5")
        public void scheduled() {
            System.out.println("hello");
        }
    }

      为了更好的帮助理解,这里再举例几个:

        【0 0/5 12,18 * * ?】         每天12点和18点,从整点开始,每隔5分钟执行一次
        【0 0 2 ?  * 1L】           每天月的最后一个星期一的凌晨2点执行一次

    邮件任务

      邮件任务,需要引入这个到pom

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

      为了收发邮件,肯定是要先配置一下邮件的收发方,以及邮件发送的账号和密码(放心不是个人登录密码)。

      注意看下边password和host的填写:

      1.password:我以网易邮箱为例,在邮箱设置里,会有POP3/SMTP这类的设置,我们就是用这种方式来使用邮箱的。当我们勾选了这个SMTP服务以后,会出现一系列的弹窗,让我们确认使用授权码登录第三方邮件的客户端,也就是说,我们用生成的授权码,作为我们需要的邮箱登录密码即可,这个是安全

      2.host:就是下边红框中的服务器地址了

    spring.mail.username=ice@163.com
    spring.mail.password=sjaksiquskaosjeq
    spring.mail.host=smtp.163.com
    # 下边的properties是配置邮件的其他信息,比如一般邮箱都需要这个SSL的安全设置
    spring.mail.properties.mail.smtp.ssl.enable=true

      如此一来,我们配置好了邮箱信息,开始写一个测试类看下:

      1.先发送一个简单的邮件做测试,执行测试后,去到收件的邮箱查看,应该就可以看到我们发送的邮件了,表示成功!

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TaskApplicationTests {
    
        @Autowired
        JavaMailSenderImpl javaMailSender;
    
        @Test
        public void contextLoads() {
            SimpleMailMessage message = new SimpleMailMessage();
            // 设置邮件信息
            message.setSubject("这个是邮件标题的设置");
            message.setText("这个是邮件的内容");
    
            message.setTo("1234@qq.com","xxxx");    // 可以给多人发
            message.setFrom("ice@163.com");     // 由谁发送
    
            javaMailSender.send(message);
        }
    
    }

      2.除了上述这个简单的邮件,我们再看看,如何发送带有html或者附件之类的内容的邮件,然后去到邮箱看看是否成功吧!

        @Test
        public void test() throws Exception {
            // 创建一个复杂消息的邮件
            MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mimeMailMessage, true);
            // 发送html格式信息
            helper.setSubject("这个是邮件标题的设置");
            helper.setText("<b style='color:red'>这个是邮件的内容</b>", true);
    
            helper.setTo("1234@qq.com");
            helper.setFrom("ice@163.com");     // 由谁发送
    
            // 上传附件
            helper.addAttachment("a.jpg", new File("C:\User\ice\Pictures\a.jpg"));
            helper.addAttachment("b.jpg", new File("C:\User\ice\Pictures\b.jpg"));
    
            javaMailSender.send(mimeMailMessage);
        }
  • 相关阅读:
    表达式计算
    atof和atoi
    十六进制与十进制之间的相互转换
    十六进制转八进制
    B. Blown Garland
    B. Arpa’s obvious problem and Mehrdad’s terrible solution
    ios::sync_with_stdio(false);
    1091 线段的重叠
    CODE[VS] 2614 安全区域
    CODE[VS] 2221 搬雕像 ——2011年台湾高级中学咨询学科能力竞赛
  • 原文地址:https://www.cnblogs.com/iceb/p/9530258.html
Copyright © 2011-2022 走看看