1

定时任务

spring boot中开启定时任务功能很简单,只需要两个注解就可以完成,它们分别是:@EnableScheduling@Scheduled

@EnableScheduling 注解

@EnableScheduling 注解标注在主启动类上即可

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

@Scheduled 注解

@Scheduled 标注在业务方法上

@Service
public class ScheduledService {
    @Scheduled(cron = "0/4 * * * * SUN-MON")
    public void task() {
        System.out.println("业务逻辑...");
    }
}

cron 表达式

表达式格式

表达式字段 字段值 允许特殊的字符
0-59 , * - /
0-59 , * - /
0-24 , * - /
日期 1-31 , * - / ? L W C
月份 1-12 , * - /
星期 0-7或SUN-SAT,0和7都表示周日 , * - / ? L C #

字符说明

特殊字符 值含义
, 用于枚举值
* 任意
- 表示区间
/ 步长
? 日或者星期冲突匹配
L 最后
W 工作日
C 和calender联系后计算过的值
# 星期 ,4#2 : 表示第二个星期四

corn 表达式示例

【0 * * * * MON-FRI】 :周一到周五每分钟执行一次
【0,1,2,3,4 * * * * SUN-MON】 : 每到秒数是 0,1,2,3,4 时执行
【0/4 * * * * * 】: 0秒启动,每隔4秒执行一次

【0 0/5 14,18 * * ?】 : 每天14点整,和18点整,每隔5分钟执行一次
【0 15 10 ? * 1-6】 : 每个月的周一至周六10:15分执行一次
【0 0 2 ? * 6L】 :每个月的最后一个周六凌晨2点执行一次
【0 0 2 LW * ?】 :每个月的最后一个工作日凌晨2点执行一次
【0 0 2-4 ? * 1#1】 : 每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次;

定时任务理解

spring boot默认使用的ThreadPoolTaskScheduler作为任务线程池,该线程池的核心线程个数是 1

public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport
        implements AsyncListenableTaskExecutor, SchedulingTaskExecutor, TaskScheduler {

    private volatile int poolSize = 1;
}

也就是说当在同一时刻系统中有多个任务同时执行时,我们的任务是单线程一个一个的执行的,为了提高执行效率,我们可以配置任务线程池线程个数

@Configuration
public class TaskConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        return taskScheduler;
    }
}

邮件任务

spring boot对邮件发送进行了整合,只需引入相关starter即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  • 配置邮件发送人信息
spring:
  mail:
    username: bbb@qq.com
    password: cybdkhhmcqclbfac  #qq邮箱授权码,qq账户设置里发短信获取
    host: smtp.qq.com
    properties:
      mail.smtp.ssl.enable: true
  • 利用 org.springframework.mail.javamail.JavaMailSenderImpl进行邮件发送
public class SpringBootCacheApplicationTests {

    @Autowired
    private JavaMailSenderImpl sender;
    /**
     * 发送简单邮件
     */
    @Test
    public void sendMail() {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setSubject("通知");
        mailMessage.setText("今晚7:00开会");
        mailMessage.setTo("aaa@163.com");
        mailMessage.setFrom("bbb@qq.com");
        sender.send(mailMessage);
    }

    /**
     * 发送复杂邮件
     *
     * @throws Exception
     */
    @Test
    public void sendMail2() throws Exception {

        MimeMessage mimeMessage = sender.createMimeMessage();
        //创建多文件邮件
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);

        messageHelper.setSubject("通知");
        messageHelper.setText("<b style='color:red;'>今晚7:00开会</b>", true);
        messageHelper.setTo("aaa@163.com");
        messageHelper.setFrom("bbb@qq.com");
        //添加附件
        messageHelper.addAttachment("nfc.png", new File("/Users/shifeifei/Desktop/nfc.png"));
        sender.send(mimeMessage);
    }
}    

异步方法

实际开发中,在某个方法中调用某个系统的方法,但是不关心该方法的返回结果,此时可以使用异步调用。spring boot 中只需要注解 @EnableAsync @Async

@SpringBootApplication
@EnableAsync
public class SpringBootCacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootCacheApplication.class, args);
    }
}

@Service
public class AsyncService {
    @Async
    public void async(){
        System.out.println("----方法同步逻辑----");
        System.out.println("异步逻辑");
        System.out.println("----方法同步逻辑----");
    }
}

一只小小鸟
144 声望25 粉丝

如何做一个深层次的思考者,从简单开始、从记录开始。