zoukankan      html  css  js  c++  java
  • SpringBoot任务篇Ⅴ --- 异步任务、定时任务、邮件任务

    Java的任务在项目中需要用到的地方很多,比如,每月月末的财务报表给财务部门,定时给领导发个邮件短信等等。这时候我们就需要用到任务了,任务调度本身涉及到多线程并发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工作。之前的学习中也使用过任务的框架Quartz,用起来也十分地编辑。本篇文章主要讲的是SpringBoot中基于注解的任务调度的简单使用。

     一.异步任务

    正常情况下,同一线程中的方法是同步执行的,比如我要请求一段数据,但是这个数据等待service层执行3s之后,然后才能返回给我,而且这个service层与我想到得到的数据没有丝毫关系。如果想要不等待service层处理数据的话,只能开启一个线程去执行service层方法,然后另外一个线程直接返回数据给我。但是这样做的话会变得很麻烦,所以我们可以使用异步任务的方式,就可以实现我上面的需求。

    1.1 开启异步任务注解

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

    1.2 异步任务执行方法

    @Service
    public class AsyncService {
        @Async
        public void hello(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("处理数据中");
        }
    }

    1.3 异步任务测试

    @Controller
    public class AsyncController {
        @Autowired
        AsyncService asyncService;
    
        @GetMapping("/hello")
        @ResponseBody
        public String hello(){
            asyncService.hello();
            return "success";
        }
    }

    运行项目,访问“/hello”请求,若页面没有经过等待直接返回“success”数据,经过3s之后控制台打印了“处理数据中”说明该异步任务执行成功。

    二.定时任务

    定时任务的使用方式和异步任务的差不多。不过需要注意的是定时任务的core表达式。

    2.1 core表达式

    例如:

    @Scheduled(cron = "0 * * * * MON-SAT")  每分钟的整秒的时候执行该方法

    @Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")  每分钟0,1,3,4秒的的时候执行该方法

    @Scheduled(cron = "0-4 * * * * MON-SAT")  每分钟0,1,3,4秒的的时候执行该方法

    @Scheduled(cron = "0/4 * * * * MON-SAT") 每四秒执行一次 (/设定步长)

    @Scheduled(cron = "0 0 2-4 ? * 1#1") 每个月的第一个周一凌晨2点到4点期间, 每个整点都执行一次

    2.2 定时任务使用

    @EnableScheduling //开启定时任务注解
    @SpringBootApplication
    public class Springboot04TaskApplication {
        public static void main(String[] args) {
            SpringApplication.run(Springboot04TaskApplication.class, args);
        }
    
    }
    @Service
    public class ScheduledService {
        /**
         * second,minute,hour,day of month,month,day of week
         * 0 * * * * MON-FRI
         */
        @Scheduled(cron = "0/4 * * * * MON-SAT")  //每四秒执行一次 (/设定步长)
        public void say(){
            System.out.println("Hello...");
        }
    }

    三.邮件任务

    SpringBoot还整合了邮件任务功能,这使得邮箱服务器发送邮件变得十分容易。

    3.1 准备工作

    3.1.1 导入邮件任务依赖

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

    3.1.2 邮箱配置

    准备两个邮箱,一个用来发送邮件,另一个用来接收邮件。其中发件的邮箱需要配置开启一下SMTP服务器服务,开启的后会得到发件邮箱密钥,记得保存起来,这将会在后面用到。

    3.2 配置参数

    spring.mail.username=**********@qq.com
    #填入上面开启服务获得的密钥
    spring.mail.password=*************
    spring.mail.host=smtp.qq.com
    #配置安全链接
    spring.mail.properties.mail.smtp.ssl.enable=true

    3.3 发送简单邮件

    @Autowired
    JavaMailSenderImpl mailSender;
    @Test
        public void contextLoads() {
            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
            simpleMailMessage.setSubject("通知");//设置标题
            simpleMailMessage.setText("恭喜你获得了优秀员工奖");//内容
            simpleMailMessage.setTo("*********@163.com"); //收件人邮箱账户
            simpleMailMessage.setFrom("********@qq.com"); //寄件人邮箱账户
            mailSender.send(simpleMailMessage);
        }

    3.4 发送复杂邮件

    @Autowired
    JavaMailSenderImpl mailSender;
    @Test
        public void compMail(){
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            try {
                MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
                mimeMessageHelper.setSubject("重要通知");//设置标题
                mimeMessageHelper.setText("恭喜你获得了优秀员工奖");//内容
                mimeMessageHelper.setText("<b style='color:red'>年终奖翻倍</b>",true);//内容  第二个参数设置是否识别html,true表示识别为html内容
                mimeMessageHelper.addAttachment("1.jpg",new File("C:\Users\admin\Desktop\快递\快递面单\圆通.png")); //传输文件
                mimeMessageHelper.addAttachment("2.jpg",new File("C:\Users\admin\Desktop\workdown\pic\jvm运行时数据区域.jpg"));
                mimeMessageHelper.setTo("************@163.com"); //收件人邮箱
                mimeMessageHelper.setFrom("*********@qq.com"); //寄件人邮箱
                mailSender.send(mimeMessage);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
    
        }
  • 相关阅读:
    CCS
    CCS
    CCS
    CCS
    CCS
    CCS
    CCS
    CCS
    Java之内部类
    Java之回调模式和ThreadLocal
  • 原文地址:https://www.cnblogs.com/wangxiayun/p/10298235.html
Copyright © 2011-2022 走看看