timer 與 quartz 總結

timer

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執行 所以需要考慮併發

quartz

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

    }
}