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

    }
}