Timer
类可以简单实现定时器功能。既然是springboot课程今天我们就来看看srpingboot整合定时器的事情@Component public class SimpleSchedule { @Autowired TestMapper testMapper; @Scheduled(cron = "*/6 * * * * ?") private void process() { List<Test> tests = testMapper.getTests(); System.out.println(tests); } }
@SpringBootApplication public class CrontabApplication { public static void main(String[] args) { SpringApplication.run(CrontabApplication.class, args); } }
#动态定时器
@Configuration public class ScheduleConfigV1 implements SchedulingConfigurer { @Autowired CronMapper cronMapper; @Autowired TestMapper testMapper; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { scheduledTaskRegistrar.addTriggerTask(()-> { System.out.println("执行定时器任务:" + LocalDateTime.now().toLocalTime()); List<Test> tests = testMapper.getTests(); System.out.println(tests); }, triggerContext -> { List<Cron> crons = cronMapper.getCron(); Cron cron = crons.get(0); return new CronTrigger(cron.getCron()).nextExecutionTime(triggerContext); }); } }
我们发现只要数据库信息修改了。定时任务会自动修改频率的。最重要的是不需要重启我们的代码。
上面虽然是动态配置了。但是有一个缺点。就是修改之后生效是在下一次出发定时器执行后有效。说白了就是一开始一小时执行一次,在这期间修改了不能立马生效必须得到下一次一小时才会去刷新配置。这里的动态可以理解成懒动态。
上面的功能虽然是动态的。但是对于量产的话肯定是不科学的。首先数据库不可能只存一条数据的。
如果存多条数据那么多条定时规则与具体的定时器这么进行匹配呢?
既然是动态的那么如何通过数据库控制定时器的开关呢?
定时任务的通过代码启动实际是scheduler.schedule(task, new CronTrigger("*/2 * * * * ?"));
实现的。这个方法返回的对象是ScheduledFuture
。通过canel方法取消定时任务。基于这两个方法我们来改进下我们之前的定时任务。
scheduler.schedule(task, new CronTrigger("*/2 * * * * ?"));
来启动定时任务。在删除节点上调用之前获取的ScheduledFuture
来canel这个定时任务。这样做的好处我们可以随时控制定时任务的开关public void addCronTask(Runnable task, String cron) { addCronTask(new CronTask(task,cron)); }
public ScheduledTask scheduleCronTask(CronTask cronTask) { ScheduledTask scheduledTask; scheduledTask = new ScheduledTask(); scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger()); return scheduledTask; }
public final class ScheduledTask { public volatile ScheduledFuture<?> future; /** * 取消定时任务 */ public void cancel() { ScheduledFuture<?> future = this.future; if (future != null) { future.cancel(true); } } }
SchedulingRunnable task = new SchedulingRunnable(TestMapper.class, "getTests", null); cronTaskRegistrar.addCronTask(task, "0/10 * * * * ?");
#总结
-上面的代码已经上传值gitee
点我传送
https://gitee.com/zxhTom/crontab.git
下面Java类使我们这次使用用到的类。想深入了解的私信我。
SchedulingConfigurer
DisposableBean
ConcurrentHashMap