<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                Quartz是OpenSymphony開源組織在工作計劃-定時任務領域的另一個開源項目。它是完全由Java開發的,可用于執行預定任務。它類似于java.util.Timer定時器。但是與timer相比,quartz增加了許多功能。 ## 一、 引入對應的 maven依賴 在 springboot2.0 后官方添加了 Quartz 框架的依賴,所以只需要在 pom 文件當中引入 ~~~ <!--引入quartz定時框架--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ~~~ ## 二、 創建一個任務類Job 首先,我們需要定義一個接口來實現計時功能。我們可以將其稱為任務(或任務),例如:定期發送電子郵件的任務,重新啟動機器的任務以及在優惠券到期時發送SMS提醒的任務。 ![](https://img.kancloud.cn/54/36/543614485c5e5761517bcac570bacf3a_1654x922.png) 由于 springboot2.0 自動進行了依賴所以創建的定時任務類直接繼承 QuzrtzJobBean 就可以了,新建一個定時任務類:QuartzSimpleTask ~~~ public class QuartzSimpleTask extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("quartz簡單的定時任務執行時間:"+new Date().toLocaleString()); } } ~~~ ## 三、創建 Quartz 定時配置類 還需要一個可以觸發任務執行的觸發器。觸發器觸發器的基本功能是指定作業的執行時間,執行間隔和運行時間。 ![](https://img.kancloud.cn/a3/8b/a38b5ea0f2d7fa8a352f410313044572_1840x808.png) 如何結合工作與觸發?也就是說,如何分配觸發器以執行指定的作業?此時,需要一個Schedule來實現此功能。 ![](https://img.kancloud.cn/2a/87/2a87b9414b244ec05ed9bc804178bb4a_1360x538.png) 將之前創建的定時任務添加到定時調度里面 ~~~ @Configuration public class QuartzSimpleConfig { //指定具體的定時任務類 @Bean public JobDetail uploadTaskDetail() { return JobBuilder.newJob(QuartzSimpleTask.class) .withIdentity("QuartzSimpleTask") .storeDurably().build(); } @Bean public Trigger uploadTaskTrigger() { //這里設定觸發執行的方式 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); // 返回任務觸發器 return TriggerBuilder.newTrigger().forJob(uploadTaskDetail()) .withIdentity("QuartzSimpleTask") .withSchedule(scheduleBuilder) .build(); } } ~~~ 最后運行項目查看效果,"\*/5 \* \* \* \* ?"表示定時任務,每隔5秒鐘執行一次。 ## 四、深入解析 ### 4.1.核心概念 * **Job**:一個僅包含一個`void execute(JobExecutionContext context)`Abstract方法的簡單接口。在實際開發中,要執行的任務是通過實現接口自定義實現的。`JobExecutionContext`提供調度上下文信息。 ~~~ public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; } ~~~ * **JobDetail**:包含多個構造函數,最常用的是`JobDetail(String name, String group, Class jobClass)`Jobclass是實現作業接口的類,name是調度程序中任務的名稱,group是調度程序中任務的組名。默認組名稱為`Scheduler.DEFAULT_GROUP`。 * **Trigger**:描述觸發作業執行的時間規則的類。包含: 1. **SimpleTrigger**:一次或固定間隔時間段的觸發規則。 2. **CronTrigger**:通過cron表達式描述更復雜的觸發規則。 * **Calendar**:Quartz 提供的**Calendar**類。觸發器可以與多個Calendar關聯以排除特殊日期。 * **Scheduler**:代表獨立于Quartz 的運行容器。在Scheduler 中注冊了Trigger和JobDetail。它們在調度程序中具有自己的名稱(名稱)和組名稱(Group)。觸發器和JobDetail名稱和組名稱的組合必須唯一,但是觸發器名稱和組名稱的組合可以與JobDetail相同。一個Job可以綁定到多個觸發器,也可以不綁定。 * * * Job還具有一個子接口:statefuljob,這是一個沒有方法的標簽接口,表示有狀態任務。 1. 無狀態任務:它具有jobdatamap復制,因此可以并發運行; 2. 有狀態任務statefuljob:共享一個jobdatamap,并且將保存對jobdatamap的每次修改。因此,前一個有statefuljob將阻止下一個statefuljob。 ### 4.2.SimpleTrigger and CronTrigger * **SimpleTrigger**可以在指定的時間段內執行一個Job任務,也可以在一個時間段內多次執行。 * **CronTrigger**功能非常強大,它基于Calendar進行作業調度,并且可以比simpletrigger更精確地指定間隔,因此crotrigger比simpletrigger更常用。Crotrigger基于cron表達式。 首先,讓我們了解cron表達式: 由七個子表達式組成的字符串的格式如下: **\[秒\] \[分鐘\] \[小時\] \[天\] \[月\] \[周\] \[年\]** 例如:`00:00:00?\* 10,11,12 1#5 2018`,表示2018年10月,11月和12月的第一周星期五的00:00:00。看上去不是很容易書寫與記憶,但是我們可以通過網絡上的在線Cron表達式生成工具,來幫助我們寫表達式:**在線生成cron表達式的工具:http:[//cron.qqe2.com/](https://cron.qqe2.com/)** | 位置 | 時間域名 | 容許值 | 允許特殊字符 | | --- | --- | --- | --- | | 1個 | 秒 | 0-59 | ,– \* / | | 2 | 分鐘 | 0-59 | ,– \* / | | 3 | 小時 | 0-23 | ,– \* / | | 4 | 日期 | 1-31 | ,– \*?/ | | 5 | 月 | 1-12 | ,– \* / | | 6 | 周 | 1-7 | ,– \*?/ | | 7 | 年份(可選) | 空1970-2099 | ,– \* / | 特殊字符的含義如下: * 星號(\*):可在所有字段中使用以指示相應時域中的每次時間。例如,分鐘字段中的\*表示“每分鐘”; * 問號(?):此字符僅在日期和星期字段中使用。通常將其指定為“無意義的值”,等同于點字符; * 減號(-):表示范圍。如果在小時字段中使用“ 10-12”,則表示10到12,即10、11、12; * 逗號(,):表示列表值。如果在星期字段中使用“星期一,星期三,星期五”,則表示星期一,星期三和星期五; * 斜線(/):X / Y表示相等的步長序列,其中X為起始值,y為增量步長值。如果在分鐘字段中使用0/15,則表示0、15、30和45秒,而5/15在分鐘字段中表示5、20、35、50,也可以使用\* / y,這等效到0 / y;
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看