欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java框架Quartz中的Trigger簡(jiǎn)析

 更新時(shí)間:2023年11月13日 09:56:26   作者:mumuwei_l  
這篇文章主要介紹了Java框架Quartz中的Trigger簡(jiǎn)析,所有類型的trigger都有TriggerKey這個(gè)屬性,表示trigger的身份;除此之外,trigger還有很多其它的公共屬性,這些屬性,在構(gòu)建trigger的時(shí)候可以通過TriggerBuilder設(shè)置,需要的朋友可以參考下

Trigger的公共屬性

所有類型的trigger都有TriggerKey這個(gè)屬性,表示trigger的身份;除此之外,trigger還有很多其它的公共屬性。這些屬性,在構(gòu)建trigger的時(shí)候可以通過TriggerBuilder設(shè)置。

trigger的公共屬性有:

  • jobKey屬性:當(dāng)trigger觸發(fā)時(shí)被執(zhí)行的job的身份;
  • startTime屬性:
    • 設(shè)置trigger第一次觸發(fā)的時(shí)間;
    • 該屬性的值是java.util.Date類型,表示某個(gè)指定的時(shí)間點(diǎn);
    • 有些類型的trigger,會(huì)在設(shè)置的startTime時(shí)立即觸發(fā),
    • 有些類型的trigger,表示其觸發(fā)是在startTime之后開始生效。比如,現(xiàn)在是1月份,你設(shè)置了一個(gè)trigger–“在每個(gè)月的第5天執(zhí)行”,然后你將startTime屬性設(shè)置為4月1號(hào),則該trigger第一次觸發(fā)會(huì)是在幾個(gè)月以后了(即4月5號(hào))。
  • endTime屬性:表示trigger失效的時(shí)間點(diǎn)。比如,”每月第5天執(zhí)行”的trigger,如果其endTime是7月1號(hào),則其最后一次執(zhí)行時(shí)間是6月5號(hào)。

其它的屬性,會(huì)在下文中解釋。

優(yōu)先級(jí)(priority)

如果你的trigger很多(或者Quartz線程池的工作線程太少),Quartz可能沒有足夠的資源同時(shí)觸發(fā)所有的trigger;這種情況下,你可能希望控制哪些trigger優(yōu)先使用Quartz的工作線程,要達(dá)到該目的,可以在trigger上設(shè)置priority屬性。比如,你有N個(gè)trigger需要同時(shí)觸發(fā),但只有Z個(gè)工作線程,優(yōu)先級(jí)最高的Z個(gè)trigger會(huì)被首先觸發(fā)。如果沒有為trigger設(shè)置優(yōu)先級(jí),trigger使用默認(rèn)優(yōu)先級(jí),值為5;priority屬性的值可以是任意整數(shù),正數(shù)、負(fù)數(shù)都可以。

注意:只有同時(shí)觸發(fā)的trigger之間才會(huì)比較優(yōu)先級(jí)。10:59觸發(fā)的trigger總是在11:00觸發(fā)的trigger之前執(zhí)行。

注意:如果trigger是可恢復(fù)的,在恢復(fù)后再調(diào)度時(shí),優(yōu)先級(jí)與原trigger是一樣的。

錯(cuò)過觸發(fā)(misfire Instructions)

trigger還有一個(gè)重要的屬性misfire;如果scheduler關(guān)閉了,或者Quartz線程池中沒有可用的線程來執(zhí)行job,此時(shí)持久性的trigger就會(huì)錯(cuò)過(miss)其觸發(fā)時(shí)間,即錯(cuò)過觸發(fā)(misfire)。

不同類型的trigger,有不同的misfire機(jī)制。

它們默認(rèn)都使用“智能機(jī)制(smart policy)”,即根據(jù)trigger的類型和配置動(dòng)態(tài)調(diào)整行為。

當(dāng)scheduler啟動(dòng)的時(shí)候,查詢所有錯(cuò)過觸發(fā)(misfire)的持久性trigger。

然后根據(jù)它們各自的misfire機(jī)制更新trigger的信息。

當(dāng)你在項(xiàng)目中使用Quartz時(shí),你應(yīng)該對(duì)各種類型的trigger的misfire機(jī)制都比較熟悉,這些misfire機(jī)制在JavaDoc中有說明。

關(guān)于misfire機(jī)制的細(xì)節(jié),會(huì)在講到具體的trigger時(shí)作介紹。

Simple Trigger

SimpleTrigger可以滿足的調(diào)度需求是:在具體的時(shí)間點(diǎn)執(zhí)行一次,或者在具體的時(shí)間點(diǎn)執(zhí)行,并且以指定的間隔重復(fù)執(zhí)行若干次。比如,你有一個(gè)trigger,你可以設(shè)置它在2015年1月13日的上午11:23:54準(zhǔn)時(shí)觸發(fā),或者在這個(gè)時(shí)間點(diǎn)觸發(fā),并且每隔2秒觸發(fā)一次,一共重復(fù)5次。

根據(jù)描述,你可能已經(jīng)發(fā)現(xiàn)了,SimpleTrigger的屬性包括:開始時(shí)間、結(jié)束時(shí)間、重復(fù)次數(shù)以及重復(fù)的間隔。這些屬性的含義與你所期望的是一致的,只是關(guān)于結(jié)束時(shí)間有一些地方需要注意。

重復(fù)次數(shù),可以是0、正整數(shù),以及常量SimpleTrigger.REPEAT_INDEFINITELY。重復(fù)的間隔,必須是0,或者long型的正數(shù),表示毫秒。注意,如果重復(fù)間隔為0,trigger將會(huì)以重復(fù)次數(shù)并發(fā)執(zhí)行(或者以scheduler可以處理的近似并發(fā)數(shù))。

如果你還不熟悉DateBuilder,了解后你會(huì)發(fā)現(xiàn)使用它可以非常方便地構(gòu)造基于開始時(shí)間(或終止時(shí)間)的調(diào)度策略。

endTime屬性的值會(huì)覆蓋設(shè)置重復(fù)次數(shù)的屬性值;比如,你可以創(chuàng)建一個(gè)trigger,在終止時(shí)間之前每隔10秒執(zhí)行一次,你不需要去計(jì)算在開始時(shí)間和終止時(shí)間之間的重復(fù)次數(shù),只需要設(shè)置終止時(shí)間并將重復(fù)次數(shù)設(shè)置為REPEAT_INDEFINITELY(當(dāng)然,你也可以將重復(fù)次數(shù)設(shè)置為一個(gè)很大的值,并保證該值比trigger在終止時(shí)間之前實(shí)際觸發(fā)的次數(shù)要大即可)。

指定時(shí)間開始觸發(fā),不重復(fù):

    SimpleTrigger trigger = (SimpleTrigger) newTrigger() 
        .withIdentity("trigger1", "group1")
        .startAt(myStartTime)                     // some Date 
        .forJob("job1", "group1")                 // identify job with name, group strings
        .build();

指定時(shí)間觸發(fā),每隔10秒執(zhí)行一次,重復(fù)10次:

    trigger = newTrigger()
        .withIdentity("trigger3", "group1")
        .startAt(myTimeToStartFiring)  // if a start time is not given (if this line were omitted), "now" is implied
        .withSchedule(simpleSchedule()
            .withIntervalInSeconds(10)
            .withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
        .forJob(myJob) // identify job with handle to its JobDetail itself                   
        .build();

5分鐘以后開始觸發(fā),僅執(zhí)行一次:

    trigger = (SimpleTrigger) newTrigger() 
        .withIdentity("trigger5", "group1")
        .startAt(futureDate(5, IntervalUnit.MINUTE)) // use DateBuilder to create a date in the future
        .forJob(myJobKey) // identify job with its JobKey
        .build();

立即觸發(fā),每個(gè)5分鐘執(zhí)行一次,直到22:00:

    trigger = newTrigger()
        .withIdentity("trigger7", "group1")
        .withSchedule(simpleSchedule()
            .withIntervalInMinutes(5)
            .repeatForever())
        .endAt(dateOf(22, 0, 0))
        .build();

建立一個(gè)觸發(fā)器,將在下一個(gè)小時(shí)的整點(diǎn)觸發(fā),然后每2小時(shí)重復(fù)一次:

    trigger = newTrigger()
        .withIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
        .startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
        .withSchedule(simpleSchedule()
            .withIntervalInHours(2)
            .repeatForever())
        // note that in this example, 'forJob(..)' is not called which is valid 
        // if the trigger is passed to the scheduler along with the job  
        .build();

    scheduler.scheduleJob(trigger, job);

TriggerBuilder(以及Quartz的其它builder)會(huì)為那些沒有被顯式設(shè)置的屬性選擇合理的默認(rèn)值。比如:如果你沒有調(diào)用withIdentity(…)方法,TriggerBuilder會(huì)為trigger生成一個(gè)隨機(jī)的名稱;如果沒有調(diào)用startAt(…)方法,則默認(rèn)使用當(dāng)前時(shí)間,即trigger立即生效。

SimpleTrigger Misfire策略

SimpleTrigger有幾個(gè)misfire相關(guān)的策略,告訴quartz當(dāng)misfire發(fā)生的時(shí)候應(yīng)該如何處理。這些策略以常量的形式在SimpleTrigger中定義(JavaDoc中介紹了它們的功能)。這些策略包括:

SimpleTrigger的Misfire策略常量:

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_FIRE_NOW
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT

CronTrigger

CronTrigger通常比Simple Trigger更有用,如果您需要基于日歷的概念而不是按照SimpleTrigger的精確指定間隔進(jìn)行重新啟動(dòng)的作業(yè)啟動(dòng)計(jì)劃。

使用CronTrigger,您可以指定號(hào)時(shí)間表,例如“每周五中午”或“每個(gè)工作日和上午9:30”,甚至“每周一至周五上午9:00至10點(diǎn)之間每5分鐘”和1月份的星期五“。

即使如此,和SimpleTrigger一樣,CronTrigger有一個(gè)startTime,它指定何時(shí)生效,以及一個(gè)(可選的)endTime,用于指定何時(shí)停止計(jì)劃。

Cron Expressions

Cron-Expressions用于配置CronTrigger的實(shí)例。Cron Expressions是由七個(gè)子表達(dá)式組成的字符串,用于描述日程表的各個(gè)細(xì)節(jié)。這些子表達(dá)式用空格分隔,并表示:

  • Seconds
  • Minutes
  • Hours
  • Day-of-Month
  • Month
  • Day-of-Week
  • Year (optional field)

一個(gè)完整的Cron-Expressions的例子是字符串“0 0 12?* WED“ - 這意味著”每個(gè)星期三下午12:00“。

單個(gè)子表達(dá)式可以包含范圍和/或列表。例如,可以用“MON-FRI”,“MON,WED,F(xiàn)RI”或甚至“MON-WED,SAT”代替前一個(gè)(例如“WED”)示例中的星期幾字段。

通配符(’ '字符)可用于說明該字段的“每個(gè)”可能的值。因此,前一個(gè)例子的“月”字段中的“”字符僅僅是“每個(gè)月”。因此,“星期幾”字段中的“*”顯然意味著“每周的每一天”。

所有字段都有一組可以指定的有效值。這些值應(yīng)該是相當(dāng)明顯的 - 例如秒和分鐘的數(shù)字0到59,數(shù)小時(shí)的值0到23。日期可以是1-31的任何值,但是您需要注意在給定的月份中有多少天!月份可以指定為0到11之間的值,或者使用字符串JAN,F(xiàn)EB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC。星期幾可以指定為1到7(1 =星期日)之間的值,或者使用字符串SUN,MON,TUE,WED,THU,F(xiàn)RI和SAT。

'/'字符可用于指定值的增量。例如,如果在“分鐘”字段中輸入“0/15”,則表示“每隔15分鐘,從零開始”。如果您在“分鐘”字段中使用“3/20”,則意味著“每隔20分鐘,從三分鐘開始” - 換句話說,它與“分鐘”中的“3,23,43”相同領(lǐng)域。請(qǐng)注意“ / 35”的細(xì)微之處并不代表“每35分鐘” - 這意味著“每隔35分鐘,從零開始” - 或者換句話說,與指定“0,35”相同。

‘?’ 字符是允許的日期和星期幾字段。用于指定“無特定值”。當(dāng)您需要在兩個(gè)字段中的一個(gè)字段中指定某個(gè)字符而不是另一個(gè)字段時(shí),這很有用。請(qǐng)參閱下面的示例(和CronTrigger JavaDoc)以進(jìn)行說明。

“L”字符允許用于月日和星期幾字段。這個(gè)角色對(duì)于“最后”來說是短暫的,但是在這兩個(gè)領(lǐng)域的每一個(gè)領(lǐng)域都有不同的含義。例如,“月”字段中的“L”表示“月的最后一天” - 1月31日,非閏年2月28日。如果在本周的某一天使用,它只是意味著“7”或“SAT”。但是如果在星期幾的領(lǐng)域中再次使用這個(gè)值,就意味著“最后一個(gè)月的xxx日”,例如“6L”或“FRIL”都意味著“月的最后一個(gè)星期五”。您還可以指定從該月最后一天的偏移量,例如“L-3”,這意味著日歷月份的第三個(gè)到最后一天。當(dāng)使用’L’選項(xiàng)時(shí),重要的是不要指定列表或值的范圍,因?yàn)槟鷷?huì)得到混亂/意外的結(jié)果。

“W”用于指定最近給定日期的工作日(星期一至星期五)。例如,如果要將“15W”指定為月日期字段的值,則意思是:“最近的平日到當(dāng)月15日”。

'#'用于指定本月的“第n個(gè)”XXX工作日。例如,“星期幾”字段中的“6#3”或“FRI#3”的值表示“本月的第三個(gè)星期五”。

Cron Expressions示例

CronTrigger示例1 - 創(chuàng)建一個(gè)觸發(fā)器的表達(dá)式,每5分鐘就會(huì)觸發(fā)一次

0 0/5 * * *?

CronTrigger示例2 - 創(chuàng)建觸發(fā)器的表達(dá)式,每5分鐘觸發(fā)一次,分鐘后10秒(即上午10時(shí)10分,上午10:05:10等)。

10 0/5 * * *?

CronTrigger示例3 - 在每個(gè)星期三和星期五的10:30,11:30,12:30和13:30創(chuàng)建觸發(fā)器的表達(dá)式。

0 30 10-13?* WED,F(xiàn)RI

CronTrigger示例4 - 創(chuàng)建觸發(fā)器的表達(dá)式,每個(gè)月5日和20日上午8點(diǎn)至10點(diǎn)之間每半小時(shí)觸發(fā)一次。請(qǐng)注意,觸發(fā)器將不會(huì)在上午10點(diǎn)開始,僅在8:00,8:30,9:00和9:30

0 0/30 8-9 5,20 *?

請(qǐng)注意,一些調(diào)度要求太復(fù)雜,無法用單一觸發(fā)表示 - 例如“每上午9:00至10:00之間每5分鐘,下午1:00至晚上10點(diǎn)之間每20分鐘”一次。在這種情況下的解決方案是簡(jiǎn)單地創(chuàng)建兩個(gè)觸發(fā)器,并注冊(cè)它們來運(yùn)行相同的作業(yè)。

構(gòu)建CronTriggers

建立一個(gè)觸發(fā)器,每隔兩分鐘,每天上午8點(diǎn)至下午5點(diǎn)之間:

trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .forJob("myJob", "group1")
    .build();

建立一個(gè)觸發(fā)器,將在上午10:42每天發(fā)射:

  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(dailyAtHourAndMinute(10, 42))
    .forJob(myJobKey)
    .build();
trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 * * ?"))
    .forJob(myJobKey)
    .build();

建立一個(gè)觸發(fā)器,將在星期三上午10:42在TimeZone(系統(tǒng)默認(rèn)值)之外觸發(fā):

trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
    .forJob(myJobKey)
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .build();
 trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 ? * WED"))
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .forJob(myJobKey)
    .build();

CronTrigger Misfire說明

CronTrigger本身的常量(包括描述其行為的JavaDoc)。說明包括:

CronTrigger的Misfire指令常數(shù)

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_DO_NOTHING
MISFIRE_INSTRUCTION_FIRE_NOW

到此這篇關(guān)于Java框架Quartz中的Trigger簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Quartz中的Trigger內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決RedisTemplate的key默認(rèn)序列化器的問題

    解決RedisTemplate的key默認(rèn)序列化器的問題

    這篇文章主要介紹了解決RedisTemplate的key默認(rèn)序列化器的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 淺談Java字符串比較的三種方法

    淺談Java字符串比較的三種方法

    這篇文章主要介紹了淺談Java字符串比較的三種方法,字符串比較是常見的操作,包括比較相等、比較大小、比較前綴和后綴串等,需要的朋友可以參考下
    2023-04-04
  • Java Web端程序?qū)崿F(xiàn)文件下載的方法分享

    Java Web端程序?qū)崿F(xiàn)文件下載的方法分享

    這篇文章主要介紹了Java Web端程序?qū)崿F(xiàn)文件下載的方法分享,包括一個(gè)包含防盜鏈功能的專門針對(duì)圖片下載的程序代碼示例,需要的朋友可以參考下
    2016-05-05
  • java打印菱形及直角和等腰三角形的方法

    java打印菱形及直角和等腰三角形的方法

    用Java輸出菱形本身是一個(gè)比較簡(jiǎn)單的問題,這是Java初學(xué)者都要編寫的一個(gè)算法,下面這篇文章主要給大家介紹了關(guān)于java打印菱形及直角和等腰三角形的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • spring的@Transactional注解用法解讀

    spring的@Transactional注解用法解讀

    這篇文章主要介紹了spring的@Transactional注解用法解讀,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • logback 配置詳解(推薦)

    logback 配置詳解(推薦)

    這篇文章主要介紹了logback 配置詳解(推薦),詳細(xì)的介紹了logback的組成使用和配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • springboot集成mybatis-maven插件自動(dòng)生成pojo的詳細(xì)教程

    springboot集成mybatis-maven插件自動(dòng)生成pojo的詳細(xì)教程

    這篇文章主要介紹了springboot集成mybatis-maven插件自動(dòng)生成pojo的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • JSON 與對(duì)象、集合之間的轉(zhuǎn)換的示例

    JSON 與對(duì)象、集合之間的轉(zhuǎn)換的示例

    在開發(fā)過程中,經(jīng)常需要和別的系統(tǒng)交換數(shù)據(jù),數(shù)據(jù)交換的格式有XML、JSON等,JSON作為一個(gè)輕量級(jí)的數(shù)據(jù)格式比xml效率要高,本篇文章主要介紹了JSON 與 對(duì)象 、集合 之間的轉(zhuǎn)換,有興趣的可以了解一下。
    2017-01-01
  • Java中難理解的四個(gè)概念

    Java中難理解的四個(gè)概念

    這篇文章主要介紹了匿名內(nèi)部類、多線程、如何實(shí)現(xiàn)同步、序列化,這四個(gè)難理解的概念,同學(xué)們一定要仔細(xì)看看
    2021-04-04
  • SpringBoot返回對(duì)象時(shí),如何將Long類型轉(zhuǎn)換為String

    SpringBoot返回對(duì)象時(shí),如何將Long類型轉(zhuǎn)換為String

    這篇文章主要介紹了SpringBoot返回對(duì)象時(shí),實(shí)現(xiàn)將Long類型轉(zhuǎn)換為String,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論