成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

springboot整合quarzt實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

hoohack / 2227人閱讀

摘要:而我這里定時(shí)任務(wù)的觸發(fā)是要通過(guò)接口的方式來(lái)觸發(fā),所以只用實(shí)現(xiàn)以下的調(diào)度器即可。我這里簡(jiǎn)單說(shuō)下任務(wù)的調(diào)度器,具體的任務(wù)類,觸發(fā)器,任務(wù)什么時(shí)候執(zhí)行是由它決定的。遇到的坑解決方式這個(gè)是因?yàn)椴患嫒莸膯?wèn)題,所以使用是不會(huì)出現(xiàn)這個(gè)錯(cuò)誤的。

實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式: 1.使用linux的crontab
優(yōu)點(diǎn):
    1.使用方式很簡(jiǎn)單,只要在crontab中寫(xiě)好
    2.隨時(shí)可以修改,不需要重啟服務(wù)器
缺點(diǎn):
    1.分布式的系統(tǒng)中不好使用,只能一臺(tái)臺(tái)機(jī)器去修改
    2.分是最小的時(shí)間單位,秒級(jí)的不能使用
2.使用spring自帶的ScheduledExecutor
優(yōu)點(diǎn):
    cronExpression比crontab的更強(qiáng)大一些支持到秒,性能更好
缺點(diǎn):
    修改了cronExpression的重啟服務(wù)器,否則不生效
3. 使用JDK自帶的Timer
優(yōu)點(diǎn): 
    輕量級(jí),執(zhí)行速度快
缺點(diǎn):
    分布式系統(tǒng)不好使用.而且不能指定時(shí)間執(zhí)行,只能按某個(gè)頻次來(lái)執(zhí)行
4. 使用quartz
優(yōu)點(diǎn):
    1.可適用于分布式系統(tǒng),quartz可支持集群模式
    2.修改了定時(shí)任務(wù)無(wú)須重啟服務(wù)器(這只是我個(gè)人想到的一些優(yōu)缺點(diǎn),網(wǎng)友有其他看法可以留言說(shuō)下)
整合步驟:

我們現(xiàn)在知道了quartz有這么優(yōu)秀,該怎么整合到項(xiàng)目中呢?筆者接下來(lái)將實(shí)現(xiàn)一個(gè)通過(guò)http接口調(diào)用來(lái)觸發(fā)動(dòng)態(tài)定時(shí)任務(wù)的一個(gè)小功能.
筆者使用的環(huán)境:

jdk:1.8.0_162;
springboot:1.5.10.RELEASE

1.引入需要的jar包,在pom文件中加入quartz的jar包和spring支持quartz的jar

         
            org.quartz-scheduler
            quartz
            2.3.1
        

        
            org.springframework
            spring-context-support
        

2.配置調(diào)度器的bean,這里spring實(shí)現(xiàn)了三個(gè)工廠類,SchedulerFactoryBean,CronTriggerBean,JobDetailBean,使用注解的方式將這三個(gè)類交給spring管理.一般看網(wǎng)上的資料都是這三個(gè)類,都交給spring管理,可以參考這篇文章這篇文章。
????而我這里定時(shí)任務(wù)的觸發(fā)是要通過(guò)接口的方式來(lái)觸發(fā),所以只用實(shí)現(xiàn)以下SchedulerFactoryBean的調(diào)度器即可。如果讀者不是很明白這幾個(gè)類是干嘛的,可以看下quartz使用的文章。
我這里簡(jiǎn)單說(shuō)下:
scheduler:任務(wù)的調(diào)度器,job:具體的任務(wù)類,trigger:觸發(fā)器,任務(wù)什么時(shí)候執(zhí)行是由它決定的。就是說(shuō)時(shí)間人物做什么,scheduler就是主語(yǔ)的人物,trigger是時(shí)間,job是做什么事。

@Configuration
public class SchedulerConfig {

    /**
     * attention:
     * Details:定義quartz調(diào)度工廠
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 用于quartz集群,QuartzScheduler 啟動(dòng)時(shí)更新己存在的Job
        bean.setOverwriteExistingJobs(true);
        // 延時(shí)啟動(dòng),應(yīng)用啟動(dòng)1秒后
        bean.setStartupDelay(1);
        return bean;
    }
}

3.具體任務(wù)類job,必須實(shí)現(xiàn)quartz的job類,這個(gè)也可以去實(shí)現(xiàn)spring的QuartJobBean(spring對(duì)job類的實(shí)現(xiàn))是一樣的,或者還有一種方式就是MethodInvokingJobDetailFactoryBean,這個(gè)類里面可以設(shè)置什么類的什么方法來(lái)執(zhí)行這個(gè)任務(wù),會(huì)更靈活一些:

@Slf4j
public class ScheduleTaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.info("任務(wù)執(zhí)行了......");
    }
}

4.http的接口來(lái)觸發(fā)該調(diào)度程序:

@Slf4j
@RestController
public class Controller {

    @Resource(name = "scheduler")
    private Scheduler scheduler;

    @PostMapping(value = "/api/executeTask")
    public String executeTask(TaskVO taskVO) {
        // job類
        JobDetail jobDetail = JobBuilder.newJob(ScheduleTaskJob.class)
               .withIdentity(taskVO.getJobName(), taskVO.getJobGroupName())
                .build();
        // 觸發(fā)器類
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(taskVO.getTriggerName(), taskVO.getTriggerGroupName())
                .startNow()
                .withSchedule(cronSchedule(taskVO.getCronExpression()))
                .build();
        try {
            // 執(zhí)行任務(wù)
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
            log.error("任務(wù)執(zhí)行異常", e);
        }
        return "success";
    }
}

5.http接口傳入的值對(duì)象,其實(shí)就是用來(lái)指定job和triger的name和groupName,__name相同的話會(huì)失敗,必須是唯一的__,
6.執(zhí)行程序看看效果:
我傳入的參數(shù):
jobName:job1
jobGroupName:jobGroup1
triggerName:trigger1
triggerGroupName:triggerGroup1
cronExpression:0/1 ?

jobName:job2
jobGroupName:jobGroup1
triggerName:trigger2
triggerGroupName:triggerGroup1
cronExpression:0/1 ?

圖中紅色方框上部是只有一個(gè)定時(shí)任務(wù),每一秒執(zhí)行一次,下部因?yàn)橛旨尤肓艘粋€(gè)新的任務(wù)所以回答引出兩個(gè)任務(wù)的執(zhí)行結(jié)果。

遇到的坑:

1.java.lang.NoSuchMethodError: org.springframework.boot.SpringApplication.run(Ljava/lang/Object;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableApplicationContext;
解決方式:這個(gè)是因?yàn)閟pringboot2不兼容的問(wèn)題,所以使用springboot1.5是不會(huì)出現(xiàn)這個(gè)錯(cuò)誤的。

2.Caused by: java.lang.ClassNotFoundException: org.springframework.transaction.PlatformTransactionManager

at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_162]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_162]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) ~[na:1.8.0_162]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_162]
39 common frames omitted
啟動(dòng)的時(shí)候如果報(bào)這個(gè)錯(cuò)的話,要引入一個(gè)spring-tx事物的包
 
            org.springframework
            spring-tx
 
源碼地址:github源碼地址,朋友們覺(jué)得寫(xiě)得還行的幫忙star個(gè),follower下,23333,感謝~ 參考資料:

[1]https://blog.csdn.net/liuchua...
[2]https://www.w3cschool.cn/quar...
[3]https://www.ibm.com/developer...
[4]http://www.quartz-scheduler.org/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77646.html

相關(guān)文章

  • Springboot整合Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

    摘要:本文使用實(shí)現(xiàn)對(duì)定時(shí)任務(wù)的增刪改查啟用停用等功能。并把定時(shí)任務(wù)持久化到數(shù)據(jù)庫(kù)以及支持集群。決定什么時(shí)候來(lái)執(zhí)行任務(wù)。定義的是任務(wù)數(shù)據(jù),而真正的執(zhí)行邏輯是在中。封裝定時(shí)任務(wù)接口添加一個(gè)暫?;謴?fù)刪除修改暫停所有恢復(fù)所有 簡(jiǎn)介 Quartz是一款功能強(qiáng)大的任務(wù)調(diào)度器,可以實(shí)現(xiàn)較為復(fù)雜的調(diào)度功能,如每月一號(hào)執(zhí)行、每天凌晨執(zhí)行、每周五執(zhí)行等等,還支持分布式調(diào)度。本文使用Springboot+Myba...

    IamDLY 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<