SpringBoot任务(异步任务、邮件任务、定时任务)

异步任务

在开发中,我们可能经常会遇到一些需要执行时间很长的任务,如果体现在前端,会让用户一直卡在那儿等待或者一直转圈圈,体验非常不好。而异步任务就可以自己新开一个线程去执行该任务,就不会出现长时间等待的问题。

  1. 这里直接以例子来感受什么是异步任务
    @Service
    public class AsyncService {
        @Async
        public void hello(){
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("数据正在处理");
        }
    }
    
  2. 在main中使用@EnableAsync开启异步功能
    @EnableAsync
    @SpringBootApplication
    public class DemoApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DemoApplication.class, args);
    	}
    
    }
    
  3. 最后写一个controller进行测试,代码如下
    @RestController
    public class AsyncController {
    
        @Autowired
        AsyncService asyncService;
    
        @GetMapping("/hello")
        public String hello(){
            asyncService.hello();
            return "ok";
        }
    }
    
  4. 此时使用浏览器访问http://localhost:8080/hello会立马显示ok字段,而不需要等待4秒,这就是异步的作用。如果没有开启异步功能,浏览器访问时会延迟4秒才显示ok字段

邮件发送任务

  1. 导入依赖javax.mail
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    
  2. 在邮箱中开启POP3/SMTP服务,并记录生成的密码(以qq邮箱为例)
    在这里插入图片描述
  3. 配置application文件,填入邮箱用户名和刚刚开启服务得到的密码。若是qq邮箱还要开启加密授权验证,其他邮箱不需要
    spring.mail.username=XXXX
    spring.mail.password=XXX
    spring.mail.host=smtp.qq.com
    
    # 开启加密授权验证
    spring.mail.properties.mail.smtp.ssl.enable=true
    
  4. 使用JavaMailSenderImpl、SimpleMailMessage、MimeMessage、MimeMessageHelper类来进行邮件发送
    SimpleMailMessage和MimeMessageHelper类中都包含一系列的设置邮件的方法,查看源码可得在这里插入图片描述
    在这里插入图片描述
  5. 发送简单邮件
    class test {
    
    	@Autowired
    	JavaMailSenderImpl mailSender;
    
    	// 简单的邮件
    	void simpleMail() {
    		SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    
    		// 设置邮件主题
    		simpleMailMessage.setSubject("你好呀");
    
    		// 设置邮件内容
    		simpleMailMessage.setText("x”);
    
    		// 收件人邮箱
    		simpleMailMessage.setTo("xxxx");
    
    		// 发件人邮箱
    		simpleMailMessage.setFrom("xxx");
    
    		mailSender.send(simpleMailMessage);
    	}
    }
    
  6. 发送复杂邮件,需要借用MimeMessageHelper类来实现
    class test {
    
    	@Autowired
    	JavaMailSenderImpl mailSender;
    
    	// 简单的邮件
    	void mineMail() {
    		// 创建复杂邮件
    		MimeMessage mimeMessage = mailSender.createMimeMessage();
    
    		MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true); // true代表支持多文本上传
    
        // 设置标题
    		mimeMessageHelper.setSubject("你好");
    
    		// true代表可以支持解析html标签
    		mimeMessageHelper.setText("<p style='color:blue'>你被北大录取了</p>",true);
    
    		// 添加附件,这里的xxxx可以使用本地文件的绝对路径来代替
    		mimeMessageHelper.addAttachment("1.jpg",new File("xxxx"));
    
        // 收件人邮箱
    		mimeMessageHelper.setTo("xxx");
    	
        // 发件人邮箱
    		mimeMessageHelper.setFrom("xxx");
    
    		mailSender.send(mimeMessage);
    }
    
    可以进一步将方法抽象出来,方便以后二次调用
    public void sendMail(boolean html,String subject,String text,String fileName,String filePath,String setTo,String setFrom) throws MessagingException {
    		// 创建复杂邮件
    		MimeMessage mimeMessage = mailSender.createMimeMessage();
    
    		MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,html); // true代表支持多文本上传
    
        // 设置邮件标题
    		mimeMessageHelper.setSubject(subject);
    
    		// true代表可以支持解析html标签,设置邮件内容
    		mimeMessageHelper.setText(text,true);
    
    		// 添加附件
    		mimeMessageHelper.addAttachment(fileName,new File(filePath));
    
    		mimeMessageHelper.setTo(setTo);
    		mimeMessageHelper.setFrom(setFrom);
    
    		mailSender.send(mimeMessage);
    	}
    

定时任务

使用到的东西:

  1. 两个接口:TaskScheduler(任务调度)和TaskExecutor(任务执行)
  2. @EnableScheduling (开启定时功能,加在main方法前面)
  3. @Scheduled(什么时候执行,加在要定时执行的方法前面 )
  4. cron表达式,可以去百度找cron表达式在线生成器,也可以自学如何写
  1. 使用@EnableScheduling注解开启定时功能
    @EnableScheduling //开启定时功能
    @SpringBootApplication
    public class DemoApplication {
    
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    
    }
    
  2. 使用@Scheduled注解和Cron表达式来指定什么时候执行这段代码
    package com.example.demo.service;
    
    @Service
    public class ScheduledService {
    
      	// 这里表示每天 12:53执行这段代码
        // 秒 分 时 日 月 周
        @Scheduled(cron="0 53 12 * * *") // 括号里面写cron表达式
        public void hello(){
            System.out.println("hello");
        }
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值