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

資訊專欄INFORMATION COLUMN

Quartz學(xué)習(xí)之入門學(xué)習(xí)

Pandaaa / 2261人閱讀

摘要:觸發(fā)器也可以給予名稱和放置在組中,以方便地將它們調(diào)度內(nèi)組織。作業(yè)可以被添加到所述調(diào)度器一次,而是具有多個(gè)觸發(fā)器注冊(cè)。調(diào)度類鏈接工作和觸發(fā)器到一起,并執(zhí)行它。

簡(jiǎn)介

Quartz是一個(gè)開源的作業(yè)調(diào)度框架,可以讓計(jì)劃的程序任務(wù)一個(gè)預(yù)定義的日期和時(shí)間運(yùn)行。Quartz可以用來(lái)創(chuàng)建簡(jiǎn)單或復(fù)雜的日程安排執(zhí)行幾十,幾百,甚至是十萬(wàn)的作業(yè)數(shù)。
官方鏈接,戳這里

Quartz是什么? 作業(yè)調(diào)度庫(kù)

Quartz 是一種功能豐富的,開放源碼的作業(yè)調(diào)度庫(kù),可以在幾乎任何Java應(yīng)用程序集成 - 從最小的獨(dú)立的應(yīng)用程序到規(guī)模最大電子商務(wù)系統(tǒng)。Quartz可以用來(lái)創(chuàng)建簡(jiǎn)單或復(fù)雜的日程安排執(zhí)行幾十,幾百,甚至是十萬(wàn)的作業(yè)數(shù) - 作業(yè)被定義為標(biāo)準(zhǔn)的Java組件,可以執(zhí)行幾乎任何東西,可以編程讓它們執(zhí)行。 Quartz調(diào)度包括許多企業(yè)級(jí)功能,如JTA事務(wù)和集群支持。

Quartz 是可自由使用,使用Apache 2.0 license授權(quán)方式。

作業(yè)調(diào)度

如果應(yīng)用程序需要在給定時(shí)間執(zhí)行任務(wù),或者如果系統(tǒng)有連續(xù)維護(hù)作業(yè),那么Quartz是理想的解決方案。

作業(yè)被安排在一個(gè)給定的觸發(fā)時(shí)運(yùn)行。觸發(fā)器可以使用以下指令的接近任何組合來(lái)創(chuàng)建:

在一天中的某個(gè)時(shí)間(到毫秒)

在一周的某幾天

在每月的某一天

在一年中的某些日期

不在注冊(cè)的日歷中列出的特定日期(如商業(yè)節(jié)假日除外)

重復(fù)特定次數(shù)

重復(fù)進(jìn)行,直到一個(gè)特定的時(shí)間/日期

無(wú)限重復(fù)

重復(fù)的延遲時(shí)間間隔

作業(yè)是由其創(chuàng)建者賦予的名字,也可以組織成命名組。觸發(fā)器也可以給予名稱和放置在組中,以方便地將它們調(diào)度內(nèi)組織。作業(yè)可以被添加到所述調(diào)度器一次,而是具有多個(gè)觸發(fā)器注冊(cè)。在企業(yè)Java環(huán)境中,作業(yè)可以執(zhí)行自己的工作作為分布式(XA)事務(wù)的一部分。

集群

故障切換

負(fù)載均衡

Quartz的內(nèi)置的群集功能,通過JDBCJobStore依靠數(shù)據(jù)庫(kù)持久

Terracotta擴(kuò)展Quartz提供集群功能,而不需要一個(gè)支持?jǐn)?shù)據(jù)庫(kù)

使用的 jar 包

quartz-2.2.1.jar

quartz-jobs-2.2.1.jar

三個(gè)重要的概念簡(jiǎn)介 Scheduler

調(diào)度器。所有的調(diào)度都是由它控制。調(diào)度類鏈接“工作”和“觸發(fā)器”到一起,并執(zhí)行它。

scheduler 實(shí)例化后,可以啟動(dòng)(start)、暫停(stand-by)、停止(shutdown)。注意:scheduler 被停止后,除非重新實(shí)例化,否則不能重新啟動(dòng);只有當(dāng) scheduler 啟動(dòng)后,即使處于暫停狀態(tài)也不行,trigger 才會(huì)被觸發(fā)(job才會(huì)被執(zhí)行)

Scheduler的生命期,從SchedulerFactory創(chuàng)建它時(shí)開始,到Scheduler調(diào)用shutdown()方法時(shí)結(jié)束;Scheduler被創(chuàng)建后,可以增加、刪除和列舉Job和Trigger,以及執(zhí)行其它與調(diào)度相關(guān)的操作(如暫停Trigger)。但是,Scheduler只有在調(diào)用start()方法后,才會(huì)真正地觸發(fā)trigger(即執(zhí)行job)

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);

Scheduler的主要函數(shù):

start():啟動(dòng)

standby():掛起

shutdown():關(guān)閉

shutdown(true)表示等待所有正在執(zhí)行的job執(zhí)行完畢后,在關(guān)閉scheduler

shutdown(false)即shutdown()表示直接關(guān)閉scheduler

注意關(guān)閉之后,scheduler不能從新開啟,會(huì)拋出異常

Trigger

Trigger用于觸發(fā)Job的執(zhí)行。當(dāng)你準(zhǔn)備調(diào)度一個(gè)job時(shí),你創(chuàng)建一個(gè)Trigger的實(shí)例,然后設(shè)置調(diào)度相關(guān)的屬性。Trigger也有一個(gè)相關(guān)聯(lián)的JobDataMap,用于給Job傳遞一些觸發(fā)相關(guān)的參數(shù)。Quartz自帶了各種不同類型的Trigger,最常用的主要是SimpleTrigger和CronTrigger。

SimpleTrigger – 允許設(shè)置開始時(shí)間,結(jié)束時(shí)間,重復(fù)間隔。主要用于一次性執(zhí)行的Job(只在某個(gè)特定的時(shí)間點(diǎn)執(zhí)行一次),或者Job在特定的時(shí)間點(diǎn)執(zhí)行,重復(fù)執(zhí)行N次,每次執(zhí)行間隔T個(gè)時(shí)間單位。

CronTrigger – 允許UNIX cron表達(dá)式來(lái)指定日期和時(shí)間來(lái)運(yùn)行作業(yè)。在基于日歷的調(diào)度上非常有用,如“每個(gè)星期五的正午”,或者“每月的第十天的上午10:15”等。

SimpleTrigger – 每5秒運(yùn)行

Trigger trigger = TriggerBuilder
    .newTrigger()
    .withIdentity("dummyTriggerName", "group1")
    .withSchedule(
        SimpleScheduleBuilder.simpleSchedule()
        .withIntervalInSeconds(5).repeatForever())
    .build();

CronTrigger – 每5秒運(yùn)行。

Trigger trigger = TriggerBuilder
    .newTrigger()
    .withIdentity("dummyTriggerName", "group1")
    .withSchedule(
        CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
    .build();
JobDetail & Job

JobDetail 定義的是任務(wù)數(shù)據(jù),而真正的執(zhí)行邏輯是在Job中。

JobDetail對(duì)象是在將job加入scheduler時(shí),由客戶端程序(你的程序)創(chuàng)建的。它包含job的各種屬性設(shè)置,以及用于存儲(chǔ)job實(shí)例狀態(tài)信息的JobDataMap。

例子說明

1.下載 jar 包

可以從官方網(wǎng)站或 Maven 中央存儲(chǔ)庫(kù)下載 Quartz 庫(kù)文件;

2.創(chuàng)建一個(gè)作業(yè)

HelloJob.java

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Hello Quartz!");
    }
}

3.創(chuàng)建觸發(fā)器,以及通過調(diào)度執(zhí)行作業(yè)

SimpleTrigger.java

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleTrigger {

    public static void main(String[] args) throws Exception {

        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("dummyJobName", "group1").build();

         // 定義一個(gè)Trigger
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName", "group1")        // 定義 name/group
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(5).repeatForever())
                .build();
        
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

CronTrigger.java

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class CronTrigger {

    public static void main(String[] args) throws Exception {
        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("dummyJobName", "group").build();

        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyJobName", "group")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

輸出的結(jié)果如下:

每隔五分鐘就會(huì)打印出一條 Hello Quartz!

Hello Quartz!
Hello Quartz!
Hello Quartz!
Quartz 的其他概念

JobExecutionContext

當(dāng) Schedule 調(diào)用一個(gè) Job,就會(huì)將 JobExecutionContext 傳遞給 Job 的 execute() 方法

Job 能通過 JobExecutionContext 對(duì)象訪問到 Quartz 運(yùn)行時(shí)候的環(huán)境以及 Job本身的明細(xì)數(shù)據(jù)

JobDataMap

在進(jìn)行任務(wù)調(diào)度時(shí) JobDataMap存儲(chǔ)在JobExecutionContext中,非常方便獲取

JobDataMap 可以用來(lái)裝載任何可序列化的數(shù)據(jù)對(duì)象,當(dāng)job 實(shí)例對(duì)象被執(zhí)行時(shí)這些參數(shù)對(duì)象會(huì)傳遞給它

JobDataMap實(shí)現(xiàn)了JDK的Map接口,并且添加了一些非常方便的方法用來(lái)存取數(shù)據(jù)基本類型

key

將Job和Trigger注冊(cè)到Scheduler時(shí),可以為它們?cè)O(shè)置key,配置其身份屬性。

Job和Trigger的key(JobKey和TriggerKey)可以用于將Job和Trigger放到不同的分組(group)里,然后基于分組進(jìn)行操作。

同一個(gè)分組下的Job或Trigger的名稱必須唯一,即一個(gè)Job或Trigger的key由名稱(name)和分組(group)組成。

實(shí)例說明

第一步:創(chuàng)建一個(gè) Job。

在這個(gè)類中,我們通過 JobExecutionContext 來(lái)獲取 JobDataMap、key以及通過自定義傳入的信息。代碼中有備注,仔細(xì)看下就知道了。

HelloJob.java

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("Hello Quartz!");
        
        // 獲取 JobDetail 的 key 和 group
        JobKey key = context.getJobDetail().getKey();
        System.out.println("JobDetail key name: "+key.getName());
        System.out.println("JobDetail key Group: "+key.getGroup());
        
        // 從 JobExecutionContext 中獲取一個(gè)實(shí)例,  獲取從 jobDetail 傳入的數(shù)據(jù)
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        String JobMsg = dataMap.getString("message");
        Float floatMsg = dataMap.getFloat("floatData");
        System.out.println("JobDetial:"+ JobMsg);
        System.out.println("floatMsg:"+ floatMsg);
        
        //獲取 trigger 的 key 和 group
        TriggerKey triggerKey = context.getTrigger().getKey();
        System.out.println("TriggerKey key name: "+triggerKey.getName());
        System.out.println("TriggerKey key Group: "+triggerKey.getGroup());
        
        // 獲取一個(gè) trigger 的 jobDataMap 實(shí)例
        JobDataMap triggerMap = context.getTrigger().getJobDataMap();
        String triggerMsg = dataMap.getString("message");
        System.out.println("triggerMsg:"+ triggerMsg);
    }
}

第二步:測(cè)試類

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleTrigger {

    public static void main(String[] args) throws Exception {

        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("dummyJobName", "group1")
                .usingJobData("message", "hello myJob1")    //傳入自定義的數(shù)據(jù)
                .usingJobData("floatData", 1.2F)
                .build();

         // 定義一個(gè)Trigger
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("dummyTriggerName", "group1")        // 定義 name/group
                .usingJobData("message", "hello myTrigger")
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(5).repeatForever())
                .build();
        
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

輸出結(jié)果

Hello Quartz!
JobDetail key name: dummyJobName
JobDetail key Group: group1
JobDetial:hello myJob1
floatMsg:1.2
TriggerKey key name: dummyTriggerName
TriggerKey key Group: group1
triggerMsg:hello myJob1

w3cschool 上的quartz 教程

官方鏈接

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

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

相關(guān)文章

  • Quartz學(xué)習(xí)之多作業(yè)、監(jiān)聽

    摘要:多作業(yè)例子在這個(gè)例子中,我們將介紹如何通過多個(gè)作業(yè)。在調(diào)度框架中,每個(gè)作業(yè)將被連接到一個(gè)唯一的觸發(fā),并且由調(diào)度器運(yùn)行它。備注說明在中,一個(gè)觸發(fā)器觸發(fā)多個(gè)作業(yè)是不可以的。第一步創(chuàng)建個(gè)作業(yè),,和。 多作業(yè)例子 在這個(gè)例子中,我們將介紹如何通過Quartz API 多個(gè)作業(yè)。在Quartz調(diào)度框架中,每個(gè)作業(yè)將被連接到一個(gè)唯一的觸發(fā),并且由調(diào)度器運(yùn)行它。 備注說明:在 Quartz 中,一個(gè)...

    miracledan 評(píng)論0 收藏0
  • Quartz學(xué)習(xí)之常用Trigger方法記錄

    摘要:分類中共包含有種觸發(fā)器。建立一個(gè)觸發(fā)器,每隔一分鐘,每天上午點(diǎn)至下午點(diǎn)之間建立一個(gè)觸發(fā)器,將在每天上午執(zhí)行第一種實(shí)現(xiàn)方式第二種實(shí)現(xiàn)方式建立一個(gè)觸發(fā)器,將在星期三上午在系統(tǒng)默認(rèn)值之外執(zhí)行第一種方式第二種方式 Trigger分類 Quartz中共包含有4種觸發(fā)器。 常用的是: SimpleTrigger 和 CronTrigger。不常用的是:CalendarIntervalTrigger...

    vibiu 評(píng)論0 收藏0
  • Quartz學(xué)習(xí)之Cron Expressions表達(dá)式

    摘要:請(qǐng)注意,觸發(fā)器將不會(huì)在上午點(diǎn)開始,僅在,,和請(qǐng)注意,一些調(diào)度要求太復(fù)雜,無(wú)法用單一觸發(fā)表示例如每上午至之間每分鐘,下午至晚上點(diǎn)之間每分鐘一次。在這種情況下的解決方案是簡(jiǎn)單地創(chuàng)建兩個(gè)觸發(fā)器,并注冊(cè)它們來(lái)運(yùn)行相同的作業(yè)。 表達(dá)式說明 Cron-Expressions 用于配置 CronTrigger的實(shí)例。Cron Expressions 是由七個(gè)子表達(dá)式組成的字符串,用于描述日程表的各個(gè)...

    Mr_zhang 評(píng)論0 收藏0
  • Vim入門學(xué)習(xí)之二(cheat sheet)

    摘要:有種東西學(xué)了記不住,是正則表達(dá)式,就是了。最近在用寫個(gè),我一個(gè)按鍵盤的,又沒什么太多的閑錢去購(gòu)買高大上的,不得已開始用上了學(xué)的好多遍都沒學(xué)會(huì)的。 有10種東西學(xué)了記不住,00是正則表達(dá)式,10就是Vim了。 最近在用python寫個(gè)side project,我一個(gè)按鍵盤的,又沒什么太多的閑錢去購(gòu)買高大上的IDE,不得已開始用上了學(xué)的好多遍都沒學(xué)會(huì)的Vim。Vim有多牛X,隨便問一個(gè)代碼...

    Shimmer 評(píng)論0 收藏0
  • Vim入門學(xué)習(xí)之二(cheat sheet)

    摘要:有種東西學(xué)了記不住,是正則表達(dá)式,就是了。最近在用寫個(gè),我一個(gè)按鍵盤的,又沒什么太多的閑錢去購(gòu)買高大上的,不得已開始用上了學(xué)的好多遍都沒學(xué)會(huì)的。 有10種東西學(xué)了記不住,00是正則表達(dá)式,10就是Vim了。 最近在用python寫個(gè)side project,我一個(gè)按鍵盤的,又沒什么太多的閑錢去購(gòu)買高大上的IDE,不得已開始用上了學(xué)的好多遍都沒學(xué)會(huì)的Vim。Vim有多牛X,隨便問一個(gè)代碼...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<