SpringBoot任务篇Ⅴ --- 异步任务、定时任务、邮件任务

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

 一.异步任务spring

正常状况下,同一线程中的方法是同步执行的,好比我要请求一段数据,可是这个数据等待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以后控制台打印了“处理数据中”说明该异步任务执行成功。app

 

二.定时任务框架

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

2.1 core表达式jvm

例如:

@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();
        }

    }
相关文章
相关标签/搜索