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) { } }