quartz兩種方式實(shí)現(xiàn)定時(shí)器

導(dǎo)入jar包,其他項(xiàng)目依賴的jar包自行導(dǎo)入

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
    </dependency>
    <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
    </dependency>

1代碼實(shí)現(xiàn):
QuartzArt類

public class QuartzArt implements Job {
  @Override
  public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      System.out.println(new Date() + ": job 1 doing something...");
  }
}

QuartzManager類(兩種方法搜需要這個(gè)類進(jìn)行管理)

public class QuartzManager {
    private Scheduler scheduler;

    /**
     * @Description: 添加一個(gè)定時(shí)任務(wù)
     *
     * @param jobName 任務(wù)名
     * @param jobGroupName  任務(wù)組名
     * @param triggerName 觸發(fā)器名
     * @param triggerGroupName 觸發(fā)器組名
     * @param jobClass  任務(wù)
     * @param cron   時(shí)間設(shè)置,參考quartz說(shuō)明文檔
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void addJob(String jobName, String jobGroupName,
                       String triggerName, String triggerGroupName, Class jobClass, String cron) {
        try {
            // 任務(wù)名,任務(wù)組,任務(wù)執(zhí)行類
            JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();

            // 觸發(fā)器
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 觸發(fā)器名,觸發(fā)器組
            triggerBuilder.withIdentity(triggerName, triggerGroupName);
            triggerBuilder.startNow();
            // 觸發(fā)器時(shí)間設(shè)定
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            // 創(chuàng)建Trigger對(duì)象
            CronTrigger trigger = (CronTrigger) triggerBuilder.build();

            // 調(diào)度容器設(shè)置JobDetail和Trigger
            scheduler.scheduleJob(jobDetail, trigger);

            // 啟動(dòng)
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description: 修改一個(gè)任務(wù)的觸發(fā)時(shí)間
     *
     * @param jobName
     * @param jobGroupName
     * @param triggerName 觸發(fā)器名
     * @param triggerGroupName 觸發(fā)器組名
     * @param cron   時(shí)間設(shè)置,參考quartz說(shuō)明文檔
     */
    public void modifyJobTime(String jobName,
                              String jobGroupName, String triggerName, String triggerGroupName, String cron) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return;
            }

            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                /** 方式一 :調(diào)用 rescheduleJob 開(kāi)始 */
                // 觸發(fā)器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 觸發(fā)器名,觸發(fā)器組
                triggerBuilder.withIdentity(triggerName, triggerGroupName);
                triggerBuilder.startNow();
                // 觸發(fā)器時(shí)間設(shè)定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                // 創(chuàng)建Trigger對(duì)象
                trigger = (CronTrigger) triggerBuilder.build();
                // 方式一 :修改一個(gè)任務(wù)的觸發(fā)時(shí)間
                scheduler.rescheduleJob(triggerKey, trigger);
                /** 方式一 :調(diào)用 rescheduleJob 結(jié)束 */

                /** 方式二:先刪除,然后在創(chuàng)建一個(gè)新的Job  */
                //JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
                //Class<? extends Job> jobClass = jobDetail.getJobClass();
                //removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
                //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
                /** 方式二 :先刪除,然后在創(chuàng)建一個(gè)新的Job */
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description: 移除一個(gè)任務(wù)
     *
     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     */
    public void removeJob(String jobName, String jobGroupName,
                          String triggerName, String triggerGroupName) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);

            scheduler.pauseTrigger(triggerKey);// 停止觸發(fā)器
            scheduler.unscheduleJob(triggerKey);// 移除觸發(fā)器
            scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 刪除任務(wù)
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description:啟動(dòng)所有定時(shí)任務(wù)
     */
    public void startJobs() {
        try {
            scheduler.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description:關(guān)閉所有定時(shí)任務(wù)
     */
    public void shutdownJobs() {
        try {
            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public Scheduler getScheduler() {
        return scheduler;
    }

    public void setScheduler(Scheduler scheduler) {
        this.scheduler = scheduler;
    }
}

測(cè)試類:Test.java

public static void main(String[] args) throws BeansException {
        QuartzManager quartzManager = (QuartzManager) ctx.getBean("quartzManager");
        try {  
            System.out.println("【系統(tǒng)啟動(dòng)】開(kāi)始(每1秒輸出一次 job2)...");      
            quartzManager.addJob("test", "test", "test", "test", MyJob.class, "0/1 * * * * ?");    

            Thread.sleep(5000);    
            System.out.println("【修改job1時(shí)間】開(kāi)始(每2秒輸出一次)...");    
            quartzManager.modifyJobTime("test", "test", "test", "test", "0/2 * * * * ?");    

            Thread.sleep(10000);    
            System.out.println("【移除job1定時(shí)】開(kāi)始...");    
            quartzManager.removeJob("test", "test", "test", "test");    

            // 關(guān)掉任務(wù)調(diào)度容器
            // quartzManager.shutdownJobs();
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

2配置文件實(shí)現(xiàn):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-lazy-init="true">

    <!-- 這個(gè)類用來(lái)做需要完成的業(yè)務(wù)-->
    <bean id="QuartzJob2" class="com.haiziyouke.service.utils.QuartzJob2"></bean>

    <!-- 定時(shí)任務(wù) -->
    <!-- 定義調(diào)用對(duì)象和調(diào)用對(duì)象的方法,這個(gè)配置和普通的一樣的,id是JobDetail的名字  -->
    <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 調(diào)用的類  -->
        <property name="targetObject" ref="QuartzJob2" />
        <!-- 調(diào)用類中的方法  -->
        <property name="targetMethod" value="doSomething" />
        <!-- 是否并發(fā)  -->
        <property name ="concurrent" value ="false"  />
    </bean>

    <!-- 定義觸發(fā)時(shí)間 ,這邊就不同了,這里必須將時(shí)間設(shè)置成無(wú)限長(zhǎng),因?yàn)槲覀円プx取數(shù)據(jù)庫(kù)的時(shí)間來(lái)做為定時(shí)器的觸發(fā)時(shí)間-->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean ">
        <property name="jobDetail" ref="jobtask" />
        <!-- cron表達(dá)式  -->

        <property name="cronExpression" value="0/5 * * * * ?" />
        <!--<property name="cronExpression" value="0 0 6 * * ?" />-->
    </bean>

    <!-- 總管理類 如果將lazy-init='false'那么容器啟動(dòng)就會(huì)執(zhí)行調(diào)度程序  -->
    <bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>

    <!--這個(gè)類是用來(lái)設(shè)置觸發(fā)時(shí)間的, startJobs方法啟動(dòng)調(diào)度容器,然后按照上面觸發(fā)器每隔1s執(zhí)行所配置的myJob2.doSomething()方法 -->
    <bean id="quartzManager" class="com.haiziyouke.service.utils.QuartzManager" lazy-init="false" init-method="startJobs" >
        <!--這個(gè)對(duì)象一定要注入,這樣類才能進(jìn)行管理,還有在類型要用get set方法,不然會(huì)報(bào)錯(cuò)。-->
        <property name="scheduler" ref="startQuertz" />
    </bean>
</beans>

業(yè)務(wù)類:QuartzJob2 (這個(gè)類可以是你項(xiàng)目中的任何一個(gè)類,只要在XML配置下就好)

public class QuartzJob2 {
    public void doSomething(){
        System.out.println(new Date() + ": job 2 doing something...");
    }
}

測(cè)試類:Test2.java

public class QuartzTest {
    public static void main(String[] args) throws BeansException {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("quartz-config.xml");
        //QuartzManager quartzManager = (QuartzManager) ctx.getBean("quartzManager");
        try {

            System.out.println(new Date() + ": job 1 doing something...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,538評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,262評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,938評(píng)論 25 709
  • 南京高淳,一個(gè)適合全家吃吃逛逛的老街。
    曦米晨露微光閱讀 567評(píng)論 0 2
  • 寫(xiě)在前面:《精進(jìn)》這本書(shū)里給出了一些答案,“精進(jìn)”一詞是來(lái)自佛教,意為“努力向善向上”。這本書(shū)為大家提供了時(shí)間、選...
    鍛紅品閱讀 271評(píng)論 0 1

友情鏈接更多精彩內(nèi)容