定时调度常用Timetask , QuartZ, Springtask。
Timetask由于时效性不好,很少作为企业级调度,而QuzrtZ开发太麻烦,所以使用Springtask进行配置。
新建一个定时调度的类,并使用注解方式进行调度
package cn.sona.microboot.task; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MyScheduler { @Scheduled(fixedRate = 2000) // 采用间隔调度,每2秒执行一次 public void runJobA() { // 定义一个要执行的任务 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("【*** MyTaskA - 间隔调度 ***】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") .format(new Date())); } @Scheduled(cron = "* * * * * ?") // 每秒调用一次 public void runJobB() { System.err.println("【*** MyTaskB - 间隔调度 ***】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") .format(new Date())); } }
在程序启动的入口开启定时调度
package cn.sona.microboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication // 启动SpringBoot程序,而后自带子包扫描 @EnableScheduling // 启用间隔调度 public class StartSpringBootMain { public static void main(String[] args) throws Exception { SpringApplication.run(StartSpringBootMain.class, args); } }
此时调度有问题,因为现在调度是串行的,如果第一个调度事件太长,会影响第二个调度;
使用线程调度池进行调度。
package cn.sona.microboot.config; import java.util.concurrent.Executors; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration // 定时调度的配置类一定要实现指定的父接口 public class SchedulerConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 开启一个线程调度池 taskRegistrar.setScheduler(Executors.newScheduledThreadPool(100)); } }
效果如图所示
【*** MyTaskB - 间隔调度 ***】2017-09-30 01:03:43.003
【*** MyTaskB - 间隔调度 ***】2017-09-30 01:03:44.001
【*** MyTaskB - 间隔调度 ***】2017-09-30 01:03:45.003
【*** MyTaskB - 间隔调度 ***】2017-09-30 01:03:46.001
【*** MyTaskB - 间隔调度 ***】2017-09-30 01:03:47.005
【*** MyTaskA - 间隔调度 ***】2017-09-30 01:03:47.740
github地址:https://github.com/sona0402/springboot-task.git