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)"> " + "通过 rbg 值设置背景颜色 " + "</p> " + "<p style="background-color:rgba(255,255,0,0.25)"> " + "通过 rbg 值设置背景颜色 " + "</p> " + "<p style="background-color:rgba(255,255,0,0.5)"> " + "通过 rbg 值设置背景颜色 " + "</p> " + "<p style="background-color:rgba(255,255,0,0.75)"> " + "通过 rbg 值设置背景颜色 " + "</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(); } } }