Spring Boot----异步任务、定时任务、邮件任务、que务、定时任务、邮件任务、quertz
定时任务
使用
@EnableScheduling
//开启任务 @EnableScheduling @SpringBootApplication public class Springboot13Application { public static void main(String[] args) { SpringApplication.run(Springboot13Application.class, args); } }
@Scheduled
或者重新创建一个类,不在@Service中,需要使用@Component
@Service public class TestService { // 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点期间,每个整点都执行一次;*/ //0/4 * * * * * : 每4秒执行一次 @Scheduled(cron = "0 * * 20 8 TUE") public void test(){ System.out.println("定时任务执行..."); } }
定时任务的同步执行测试
执行玩test1后5秒执行test2,执行test2后2秒在执行test1,两个人任务来回交替执行
private int i; private int k; @Scheduled(cron = "0/1 * * * * *") public void test() throws InterruptedException { i++; System.out.println("test1..."+i); Thread.sleep(5000); } @Scheduled(cron = "0/1 * * * * *") public void test2() throws InterruptedException { k++; System.out.println("test2..."+k); Thread.sleep(2000); }
定时任务的异步执行测试(方式一)
@EnableAsync
//开启异步功能 @EnableAsync @SpringBootApplication public class Springboot13Application { public static void main(String[] args) { SpringApplication.run(Springboot13Application.class, args); } }
@Async
@Service public class TestService { //表示这是一个异步方法 @Async public void test(){ } }
测试
两个任务同时执行
private int i; private int k; @Scheduled(cron = "0/1 * * * * *") @Async public void test() throws InterruptedException { i++; System.out.println("test1..."+i); Thread.sleep(5000); } @Scheduled(cron = "0/1 * * * * *") @Async public void test2() throws InterruptedException { k++; System.out.println("test2..."+k); Thread.sleep(2000); }
多线程实现并行执行任务(方式二)
和方式一的区别,在于方式二中多个任务可以同时执行(不同任务之间相互不影响),但是,任务一必须等待任务一结束,才可以继续执行任务一
只需要创建一个配置类即可
@Configuration @EnableScheduling。//如果启动类上有注解,应该可以不加 public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer { //线程池线程数量 private int corePoolSize = 5; @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.initialize();//初始化线程池 scheduler.setPoolSize(corePoolSize);//线程池容量 return scheduler; } @Override public Executor getAsyncExecutor() { Executor executor = taskScheduler(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { scheduledTaskRegistrar.setTaskScheduler(taskScheduler()); } }
cron表达式
关于?的问题
比如我的任务是每个月的周一10点进行调度
0 0 10 * * 1 这种写法就是错的
0 0 10 ? * 1 这种写法就是对的,因为并不是每个月中的每一天都是周一,如果天和星期冲突了,就要写出?,所以天和星期如果一个指明了,另一个没有指明,那另一个只能用?代替
邮件任务
使用
pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
application.properties
spring.mail.username=1847003070@qq.com spring.mail.password=xyxvywpfxzscejxx spring.mail.host=smtp.qq.com
测试
@Autowired JavaMailSender javaMailSender; @Test public void test(){ //简单邮件测试 SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setSubject("通知"); simpleMailMessage.setText("今天放假啦"); simpleMailMessage.setTo("760423314@qq.com"); simpleMailMessage.setFrom("1847003070@qq.com"); javaMailSender.send(simpleMailMessage); } @Test public void test2() throws MessagingException { //复杂邮件测试 MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true); mimeMessageHelper.setSubject("通知"); mimeMessageHelper.setText("<b>今天放假啦</b>",true); mimeMessageHelper.setFrom("1847003070@qq.com"); mimeMessageHelper.setFrom("760423314@qq.com"); //上传文件 mimeMessageHelper.addAttachment("1.jpg",new File("C:\\Users\\Public\\Pictures\\Sample Pictures")); }
quertz
方式1
pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
配置
@Configuration public class SchedulerQuartz { @Autowired private SchedulerFactoryBean schedulerFactoryBean; private void scheduleJob1(Scheduler scheduler) throws SchedulerException { //创建jobDetail JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build(); // scheduleBuilder CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?"); //创建Trigger CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1") .usingJobData("name","王智1").withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail,cronTrigger); } private void scheduleJob2(Scheduler scheduler) throws SchedulerException{ JobDetail jobDetail = JobBuilder.newJob(ScheduledJob2.class) .withIdentity("job2", "group2").build(); // 12秒的倍数执行 12 24 36 48 60 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?"); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group2") .usingJobData("name","王智2").withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail,cronTrigger); } /** * @Description 定时任务 **/ @Bean public Scheduler scheduleJobs() throws SchedulerException { Scheduler scheduler = schedulerFactoryBean.getScheduler(); scheduleJob1(scheduler); scheduleJob2(scheduler); return scheduler; } } //-------------------------------------------------- public class ScheduledJob2 implements Job { private String name; public void setName(String name) { this.name = name; } @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); System.out.println("CRON ----> schedule job2 is running ... + " + name + " ----> " + dateFormat.format(new Date())); } }
方式2