实现定时任务的几种方式:1.使用linuxcrontab优点:1.使用方式很简单,只要写在crontab里就可以2.修改即可anytime无需重启服务器缺点:1.在分布式系统中不好用,只能修改一台机器。2.分钟是最小的时间单位,不能用秒。2.使用Spring自带的ScheduledExecutor优点:cronExpression比crontab更强大一些支持到秒,性能更好缺点:修改cronExpression需要重启服务器,否则不生效只能按一定频率执行4.使用quartz的优点:1.适用于分布式系统,quartz可以支持集群模式2.修改定时任务无需重启服务器(这只是我个人认为的一些优缺点,网友有其他看法,可以留言下面)集成步骤:我们现在知道quartz这么好,怎么集成到项目中呢?笔者将实现一个通过http接口调用触发动态定时任务的小功能。笔者使用的环境:jdk:1.8.0_162;springboot:1.5.10.RELEASE1。引入需要的jar包,在pom文件中添加quartz的jar包和支持quartz的spring的jarorg.quartz-schedulerquartz2.3.1org.springframeworkspring-context-ssupport2.配置调度器的bean。这里spring实现了三个工厂类,SchedulerFactoryBean、CronTriggerBean、JobDetailBean。使用注解将这三个类交给spring管理。一般网上看到的资料都是这三类,都交给spring管理。可以参考这篇文章和这篇文章。这里定时任务的触发是通过接口来触发的,所以只能使用实现了下面SchedulerFactoryBean的调度器。如果读者不太明白这些类是做什么用的,可以看quartz使用的文章。这里简单说一下:scheduler:任务的调度器,job:具体的任务类,trigger:触发器,任务什么时候执行由它决定。也就是说,timecharacter做什么,scheduler是subjectcharacter,trigger是time,job是做什么。@ConfigurationpublicclassSchedulerConfig{/***注意:*细节:定义石英调度工厂*/@Bean(name="scheduler")publicSc??hedulerFactoryBeanschedulerFactory(){SchedulerFactoryBeanbean=newSchedulerFactoryBean();//对于quartz集群,当QuartzScheduler启动时,更新已有的Jobbean.setOverwriteExistingJobs(true);//延迟启动,bean.setStartupDelay(1);返回豆;}}3.具体的任务类job必须实现quartz的job类,这个也可以用来实现spring的QuartJobBean(spring对job类的实现)是一样的,或者还有一个方法是MethodInvokingJobDetailFactoryBean,哪个类和方法可以在这个类中设置来执行这个任务,这样会更加灵活:}}4.http接口触发调度器:@Slf4j@RestControllerpublicclassController{@Resource(name="scheduler")privateScheduler调度器;@PostMapping(value="/api/executeTask")publicStringexecuteTask(TaskVOtaskVO){//作业类JobDetailjobDetail=JobBuilder.newJob(ScheduleTaskJob.class).withIdentity(taskVO.getJobName(),taskVO.getJobGroupName()).build();//触发器类Triggertrigger=TriggerBuilder.newTrigger().withIdentity(taskVO.getTriggerName(),taskVO.getTriggerGroupName()).startNow().withSchedule(cronSchedule(taskVO.getCronExpression())).build();try{//执行任务scheduler.scheduleJob(jobDetail,trigger);}catch(SchedulerExceptione){log.error("任务执行异常",e);}返回“成功”;}}5。http接口传入的value对象其实是用来指定job和trigger的6.执行程序看看效果:我传入的参数:jobName:job1jobGroupName:jobGroup1triggerName:trigger1triggerGroupName:triggerGroup1cronExpression:0/1?jobName:job2jobGroupName:jobGroup1triggerName:trigger2triggerGroupName:triggerGroup1cronExpression:0/1?图中红框上部只有一个定时任务,每秒执行一次。下半部分是因为新增了一个任务,所以回答导致两个任务执行结果遇到的坑:1.java.lang.NoSuchMethodError:org.springframework.boot.SpringApplication.run(Ljava/lang/Object;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableApplicationContext;解决方法:这是因为springboot2不兼容,所以使用springboot1.5不会出现这个错误。2.引起:java.lang.ClassNotFoundException:org.springframework.transaction.PlatformTransactionManageratjava.net.URLClassLoader.findClass(URLClassLoader.java:381)~[na:1.8.0_162]atjava.lang.ClassLoader.loadClass(ClassLoader.java:424)~[na:1.8.0_162]atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)~[na:1.8.0_162]atjava.lang.ClassLoader.loadClass(ClassLoader.java:357)~[na:1.8.0_162]39如果commonframesomitted启动时报这个错,应该引入spring-tx包org.springframeworkspring-tx源码地址:github源码地址,觉得写的还行的朋友,帮忙star,关注下,23333,谢谢~参考资料:[1]https://blog.csdn.net/liuchua...[2]https://www.w3cschool.cn/quar...[3]https://www.ibm.com/developer...[4]http://www.quartz-scheduler.org/