timer 用于执行timerTask类 timerTask 实现了runnable 接口 其实timer 就是启动timerTask线程 执行任务
1.schedule 4种重载
(1)在指定特定时间执行任务
(2)指定延迟时间后执行任务
(3)指定延迟时间后执行任务,并且指定时间重复执行任务
(4)指定特定时间执行任务,并且指定时间重复执行任务
2.cancel 取消所有任务 timerTask 中的 cancel 只取消自己 一个任务
3.schedule 与scheduleAtFixedRate 区别
(1)启动任务的 时间已经大于 指定的时间 比如指定 12:00:00 执行任务 实际开始于12:00:06
若每2秒执行一次, scheduleAtFixedRate 则会吧 前面 未执行的 任务次数补上 并且迅速执行完,所以需要考虑并发,schedule 则不会。
(2)执行任务时间大于时间 间隔 若指定每2秒 执行一次, 实际执行任务时间为5秒,比如指定 12:00:00 执行任务
schedule 第二次执行任务则会在 12:00:06 开始执行
scheduleAtFixedRate 依然在 12:00:02执行 所以需要考虑并发
4大主要元素
1.job接口 execute方法 用于执行需要的任务
2.JobDetail接口 用于配置任务的一些参数 及任务
3.trigger调度器 用于配置任务的执行方式执行时间
4.scheduler调度器 用于执行任务
关于cron的通配符解释如下
最后spring+quartz 下面是spring 使用quartz 的类 可在xml 或者直接在 类中进行配置
1.MethodInvokingJobDetailFactoryBean 和 JobDetailFactoryBean 的作用 与上面的 JobDetail
xml配置
<!-- ======================== 任务 Task配置 ======================== --> <!--由MethodInvokingJobDetailFactoryBean实现--> <bean id="quartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> //执行类的实例 <property name="targetObject" ref="quartzJobTest"/> //执行方法 <property name="targetMethod" value="execute"/> //是否支持并发 <property name="concurrent" value="false"/> </bean> <!-- ======================== 配置定时调度 触发器 ======================== --> <!--由CronTriggerFactoryBean实现--> <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="quartzJob"/> //上面任务的Task配置bean <property name="cronExpression" value="0 */1 * * * ?"/> //触发时机表达式 cron表达式在文章的最末尾会说 </bean> <!-- ======================== 调度工厂(中心调度器) ======================== --> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no"> <property name="triggers"> <list> <ref bean="cronTrigger2"/> //上面配置的触发器 可以配置多个任务 </list> </property> </bean>
@Component public class quartzJobTest { public void execute(){ //执行任务的代码 } }
spring boot 中一般配置 schdulerFactory 和 scheduler 然后 利用监听器调用
@Bean(name="SchedulerFactory") public SchedulerFactoryBean schedulerFactoryBean() throws IOException { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setQuartzProperties(quartzProperties()); return factory; }
/* * 通过SchedulerFactoryBean获取Scheduler的实例 */ @Bean(name="Scheduler") public Scheduler scheduler() throws IOException { return schedulerFactoryBean().getScheduler(); }
@WebListener public class MyListener implements ServletContextListener { @Autowired private Scheduler scheduler; @Override public void contextInitialized(ServletContextEvent servletContextEvent) { try { scheduler.scheduleJob(JobBuilder.newJob().build(), TriggerBuilder.newTrigger().build()); } catch (SchedulerException e) { e.printStackTrace(); } } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }