springboot(十一)SpringBoot任务

github地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service

1. 异步任务

方法名加上注解@Async,在启动类上加上@EnableAsync

    @Async //Async底层使用AOP技术,在运行时单独创建一个线程进行执行
    public void brianAsync(){
        try {
            Thread.sleep(3000);
            brianMail.sendEmail();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
   logger.debug("异步任务");
}

2.定时器任务

方法名加上注解@Scheduled,在启动类上加上@EnableScheduling,最主要的掌握正则表达式的规则

@Scheduled(cron = "0/5 * * * * *")
    public void brianScheduling() {
    logger.debug("定时任务");
 }

 补充:

@Scheduled所支持的参数:

1.cron:cron表达式,指定任务在特定时间执行;
2.fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
3.fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
4.fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
5.fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
6.initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
7.initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
8.zone:时区,默认为当前时区,一般没有用到。

Cron表达式范例:

每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?

3.定时器任务并行执行

SpringBoot对任务有比较好的支撑,我们只需要实现SchedulingConfigurer接口,并重写setSchedulerfang方法即可

/**
 *  设置线程池大小
 *
 *   newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
 */
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}

测试结果:可以发现不是在同一个线程里面执行

 关于Exetutors的使用可以参考这篇博客:java并发编程--Executor框架

 

4.邮件任务

package com.kawa.mail;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

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

@Service
public class BrianMail {

    @Autowired
    JavaMailSenderImpl javaMailSender;

    public void sendEmail() {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            //multipart:true表示开启附件添加
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            //邮件设置
            mimeMessageHelper.setSubject("测试邮件");
            mimeMessageHelper.setText("<p style=\"background-color:rgb(255,255,0)\">\n" +
                    "通过 rbg 值设置背景颜色\n" +
                    "</p>\n" +
                    "<p style=\"background-color:rgba(255,255,0,0.25)\">\n" +
                    "通过 rbg 值设置背景颜色\n" +
                    "</p>\n" +
                    "<p style=\"background-color:rgba(255,255,0,0.5)\">\n" +
                    "通过 rbg 值设置背景颜色\n" +
                    "</p>\n" +
                    "<p style=\"background-color:rgba(255,255,0,0.75)\">\n" +
                    "通过 rbg 值设置背景颜色\n" +
                    "</p>",true);
            mimeMessageHelper.setFrom("xxxxxxxxx@qq.com");
            mimeMessageHelper.setTo("xxxxxxxxx@qq.com");
            mimeMessageHelper.setCc("xxxxxxxxx@qq.com");
            //附件
            mimeMessageHelper.addAttachment("10086.jpg",new File("C:\\Users\\HYHGHHHH\\Desktop\\backup\\10086.jpg"));
            javaMailSender.send(mimeMessage);
            System.out.println("邮件发送成功...");
        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }
}

 

posted @ 2018-10-15 18:38  Brian_Huang  阅读(323)  评论(0编辑  收藏  举报