美文网首页
Quartz实现跑批

Quartz实现跑批

作者: Winter_Soldier | 来源:发表于2018-07-30 22:27 被阅读0次

    Quartz介绍

    1.特点

    (1)强大的调度功能:作为spring默认的调度框架,很容易与spring集成,实现灵活可配置的调度功能;还提供了调度运行环境的持久化机制,可以保存并恢复调度现场,
    即使系统因故障关闭,任务调度现场数据并不会丢失。

    (2)灵活的应用方式:允许开发者灵活的定义触发器的调度时间表并可以为触发器和任务进行关联映射。

    (3)分布式和集群能力。

    2.主要用到的设计模式

    • Builder模式
    • Factory模式
    • 组件模式
    • 链式写法

    3.三个核心概念

    • 调度器:负责定期定时定频率的去执行任务
    • 任务:包括了业务逻辑
    • 触发器:让东西生效的时间

    4.Quartz的体系结构

    体系结构.jpg

    5.实现

    pom.xml:

    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.2.3</version>
            </dependency>
    

    applicationContext.xml配置:每五秒轮询一次。注意:周和日期不能同时为通配符”*“

    <bean id="planInfoServiceImpl" class="com.xxx.xxx"></bean>
        <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="planInfoServiceImpl"></property>
            <property name="targetMethod" value="backup"></property> 
        </bean>
        <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="jobDetail"></property>
            <property name="cronExpression" value="*/5 * * * * ? *"></property>
    </bean>
    

    业务逻辑从spring容器中拿到任务和触发器:

        @Autowired
        private JobDetail jobDetail;
        @Autowired
        private CronTrigger trigger;
    

    业务逻辑创建管理:使用此方法不会采用shutdown销毁Scheduler,因为销毁Scheduler后再次加载jobDetail时会报身份标识存在的异常,索性任务调度使用完毕后使用pauseAll()暂停任务调度,需要时恢复调度,按需修改触发周期。

        SchedulerFactory ss = new StdSchedulerFactory();
            try {
                if(sched==null){//第一次使用加载任务和触发器
                    sched = ss.getScheduler();
                    sched.scheduleJob(jobDetail, trigger);
                }else{//非第一次触发,恢复任务调度
                    try {
                        trigger.setCronExpression("*/5 * * * * ? *");
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    sched.resumeAll();
                }        
                if(!sched.isShutdown()){
    
                    sched.start();
                }
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
    

    相关文章

      网友评论

          本文标题:Quartz实现跑批

          本文链接:https://www.haomeiwen.com/subject/yumqvftx.html