SpringBoot中完成异步任务、邮件发送任务和定时任务

   今天和大家分享下昨天完成的SpringBoot中的异步任务、邮件发送任务和定时任务,我也是个回顾,大家也可以进行学习,一举两得,下面直奔主题。

   1、异步任务:

   首先介绍下异步是什么:举个例子吧,就是A流程请求接口B之后,不需要等待B应答,而是接着继续执行A剩余的逻辑,这样A的操作叫做异步处理。
   异步的实现:在SpringBoot中,实现异步任务只需要两步,一是在添加异步注解@Async;二是开启异步任务注解@EnableAsync。代码实现如下:
   在异步任务方法上进行使用@Async注解,代码如下:

package com.ygl.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author ygl
 * @description
 * @date 2020/11/9 16:00
 */
@Service
public class AsynService{
    
    
    //异步任务 注解
    @Async
    public void hello() throws InterruptedException {
    
    
        Thread.sleep(3000);
        System.out.println("数据正在处理、、、");
    }

}

注意:@Async注解只能使用在public方法上
   然后在启动类上开启异步任务,代码如下所示:

package com.ygl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableAsync //开启异步注解
public class Springboot09TestApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(Springboot09TestApplication.class, args);
    }

}

以上就是使用异步任务你的步骤,非常简单,下面我们写个controller类来进行测试下异步任务,代码如下所示:

package com.ygl.controller;

import com.ygl.service.AsynService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ygl
 * @description
 * @date 2020/11/9 16:03
 */
@RestController
public class AsyncController {
    
    
    @Autowired
    private AsynService asynService;
    @GetMapping("/hello")
    public String hello() throws InterruptedException {
    
    
        asynService.hello();
        return "ok";

    }
}

测试可以看到,我们在注解的方法中休眠了3秒,但是在调用controller层的时候,直接返回"ok"字段,然后等3秒后才进行打印注解方法中的打印语句,说明是成功的完成异步任务。

   2、邮件发送任务

   邮件发送任务就是通过代码进行将邮件进行发送过去,邮件发送分为两种情况,一种是简单邮件发送,另一种位复杂邮件发送。

   1、简单邮件发送

   首先在pom依赖中导入mail(邮件发送)的依赖,依赖代码如下图所示:

<!-- 邮件任务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

然后在test中测试编写代码,首先需要注入邮件发送的实现类JavaMailSenderImpl javaMailSender;代码如下图所示:

package com.ygl;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@SpringBootTest
class Springboot09TestApplicationTests {
    
    

    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    void contextLoads() {
    
    
        //一个简单邮件发送
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        //主题
        simpleMailMessage.setSubject("这是邮件主题");
        //内容
        simpleMailMessage.setText("这是邮件内容");
        //发送者
        simpleMailMessage.setFrom("[email protected]");
        //接受者
        simpleMailMessage.setTo("[email protected]");
        //发送
        javaMailSender.send(simpleMailMessage);
    }
}

    2、复杂邮件发送:

   首先肯定是引入依赖啦,依赖和上面的简单邮件发送依赖一样,然后接下来编写发送复杂邮件代码,代码如下:

package com.ygl;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@SpringBootTest
class Springboot09TestApplicationTests {
    
    

    @Autowired
    JavaMailSenderImpl javaMailSender;
    
    @Test
    void contextLoads2() throws MessagingException {
    
    
        //一个复杂邮件发送
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //组装
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        //正文  类似选择文件大小 字体  颜色等等
        helper.setSubject("测试邮件主题plus");
        //后面的true是代表开启html支持
        helper.setText("<p style='color:red'>测试内容</p>",true);

        //附件   文件地址
        helper.addAttachment("1.jpg",new File("C:\\Users\\ygl\\Pictures\\2.jpg"));
        helper.addAttachment("2.jpg",new File("C:\\Users\\ygl\\Pictures\\2.jpg"));
        helper.setFrom("[email protected]");
        helper.setTo("[email protected]");
        javaMailSender.send(mimeMessage);
    }

}

对了,还有最重要的,要在yml文件中进行配置,配置代码如下:

spring:
  mail:
    username: 153981111@qq.com
    password: tlnhbmwmoviqiaaf
    #QQ邮箱这样   其余不是这样
    host: smtp.qq.com
    #QQ需要加密,其余邮箱不需要 开启加密验证
    properties:
      mail:
        smtp:
          ssl:
            enable: true

注意: yml的配置中我这个是QQ邮箱的配置,如果大家的邮箱是网易之类的大家要记得更改哦。

   3、定时任务

    今天所讲的SpringBoot创建定时任务是非常简单的,基于注解的,当然还有其他两种方式,分别位基于接口和基于注解设定的多线程定时任务,这两者在这里不给大家叙述,在这里只讲第一种基于注解的方式。
    基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行会受上一个任务执行时间的影响。基于注解创建的定时任务只需要两个注解,一是注解 @Scheduled,另一个注解是开启定时任务的注解@EnableScheduling。然后再在启动类上开启定时任务注解 @EnableScheduling,代码如下:

public class SchedulingService{
    
    
    //3.添加定时任务
    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void Scheduling() {
    
    
        System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
    }
}

注意: cron表达式在这里不过多描述,大家可以去进行搜索。
最后记得再在启动类上开启定时任务注解 @EnableScheduling
大家有问题的话在下方进行评论留言,和大家一起探讨,欢迎点赞转发评论

猜你喜欢

转载自blog.csdn.net/weixin_45150104/article/details/109582110