SpringBoot整合Quartz 2實現定時任務之一:整合

1、前言說明

《SpringBoot定時任務說明》這篇文章有說明過SpringBoot的定時任務實現方式,不過介紹的是一種輕量級的定時任務實現。但對於高級的定時需求,就難以滿足了:比如工程運行過程中控制定時任務的開關等。這個時候就需要引入Quartz了,本文主要介紹了SpringBoot與Quartz的整合。

2、整合步驟

所需依賴,下述依賴包只截取了整合所需依賴,SpringBoot配置所需依賴不包括其中:

1.7

UTF-8

4.2.7.RELEASE

org.springframework

spring-context-support

${spring.version}

org.mybatis

mybatis

3.1.1

org.mybatis

mybatis-spring

1.1.1

org.springframework.boot

spring-boot-starter-jdbc

org.quartz-scheduler

quartz

2.2.3

項目整合的是最新版的Spring版本即4.2.7.RELEASE,同時Quartz也是最新版的2.2.3,如果融合工程後,出現錯誤,首先檢查下版本是否有問題。

在Spring中使用Quartz有兩種方式實現:第一種是任務類繼承QuartzJobBean,第二種則是在配置文件裡定義任務類和要執行的方法,類和方法可以是普通類。很顯然,第二種方式遠比第一種方式來的靈活。

這裡採用的就是第二種方式。

run

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

0/10 * * * * ?

TestTask類則是一個普通的Java類,沒有繼承任何類和實現任何接口(當然可以用註解方式來聲明bean):

public class TestTask {

/** 日誌對象 */

private static final Logger LOG = LoggerFactory.getLogger(TestTask.class);

public void run() {

if (LOG.isInfoEnabled()) {

LOG.info("測試任務線程開始執行");

//new ScheduleJobService().getScheduleJob();

}

}

}

至此,簡單的整合大功告成,run方法將每隔5秒執行一次,因為配置了concurrent等於false,所以假如run方法的執行時間超過5秒,在執行完之前即使時間已經超過了5秒下一個定時計劃執行任務仍不會被開啟,如果是true,則不管是否執行完,時間到了都將開啟。

順便貼一下cronExpression表達式備忘:

字段允許值允許的特殊字符秒0-59– * /分0-59– * /小時0-23– * /日期1-31– * ? / L W C月份1-12 或者 JAN-DEC– * /星期1-7 或者 SUN-SAT– * ? / L C #年(可選)留空1970-2099– * /

表達式意義

表達式允許值“0 0 12 * * ?”每天中午12點觸發“0 15 10 ? * *”每天上午10:15觸發“0 15 10 * * ?”每天上午10:15觸發“0 15 10 * * ? *”每天上午10:15觸發“0 15 10 * * ? 2005”2005年的每天上午10:15觸發“0 * 14 * * ?”在每天下午2點到下午2:59期間的每1分鐘觸發“0 0/5 14 * * ?”在每天下午2點到下午2:55期間的每5分鐘觸發“0 0/5 14,18 * * ?”在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發“0 0-5 14 * * ?”在每天下午2點到下午2:05期間的每1分鐘觸發“0 10,44 14 ? 3 WED”每年三月的星期三的下午2:10和2:44觸發“0 15 10 ? * MON-FRI”週一至週五的上午10:15觸發“0 15 10 15 * ?”每月15日上午10:15觸發“0 15 10 L * ?”每月最後一日的上午10:15觸發“0 15 10 ? * 6L”每月的最後一個星期五上午10:15觸發“0 15 10 ? * 6L 2002-2005”2002年至2005年的每月的最後一個星期五上午10:15觸發“0 15 10 ? * 6#3”每月的第三個星期五上午10:15觸發0 6 * * *每天早上6點0 /2 * *每兩個小時0 23-7/2,8 * * *晚上11點到早上8點之間每兩個小時,早上八點0 11 4 * 1-3每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點0 4 1 1 *1月1日早上4點

3、運行結果

016-07-31-13-13 [main] [com.alibaba.App] [INFO] - oops: main入口函數編碼-UTF-8

. ____ _ __ _ _

/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

\\/ ___)| |_)| | | | | || (_| | ) ) ) )

' |____| .__|_| |_|_| |_\__, | / / / /

=========|_|==============|___/=/_/_/_/

:: Spring Boot :: (v1.3.6.RELEASE)

2016-07-31-13-13 [main] [com.alibaba.App] [INFO] - Starting App on localhost with PID 1781 (/Users/xiaolong/Documents/workspace/quartz-springboot/target/classes started by xiaolong in /Users/xiaolong/Documents/workspace/quartz-springboot)

2016-07-31-13-13 [main] [com.alibaba.App] [INFO] - No active profile set, falling back to default profiles: default

2016-07-31-13-13 [main] [org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext] [INFO] - Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@68231c67: startup date [Sun Jul 31 13:13:42 CST 2016]; root of context hierarchy

2016-07-31-13-13 [main] [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] [INFO] - Loading XML bean definitions from class path resource [spring/applicationContext.xml]

2016-07-31-13-13 [main] [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer] [INFO] - Loading properties file from class path resource [spring/config/application-dev.properties]

2016-07-31-13-13 [background-preinit] [org.hibernate.validator.internal.util.Version] [INFO] - HV000001: Hibernate Validator 5.2.4.Final

2016-07-31-13-13 [main] [org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer] [INFO] - Tomcat initialized with port(s): 7001 (http)

2016-07-31-13-13 [main] [org.apache.catalina.core.StandardService] [INFO] - Starting service Tomcat

2016-07-31-13-13 [main] [org.apache.catalina.core.StandardEngine] [INFO] - Starting Servlet Engine: Apache Tomcat/8.0.36

2016-07-31-13-13 [localhost-startStop-1] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]] [INFO] - Initializing Spring embedded WebApplicationContext

2016-07-31-13-13 [localhost-startStop-1] [org.springframework.web.context.ContextLoader] [INFO] - Root WebApplicationContext: initialization completed in 884 ms

2016-07-31-13-13 [main] [org.quartz.impl.StdSchedulerFactory] [INFO] - Using default implementation for ThreadExecutor

2016-07-31-13-13 [main] [org.quartz.core.SchedulerSignalerImpl] [INFO] - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

2016-07-31-13-13 [main] [org.quartz.core.QuartzScheduler] [INFO] - Quartz Scheduler v.2.2.3 created.

2016-07-31-13-13 [main] [org.quartz.simpl.RAMJobStore] [INFO] - RAMJobStore initialized.

2016-07-31-13-13 [main] [org.quartz.core.QuartzScheduler] [INFO] - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'scheduler' with instanceId 'NON_CLUSTERED'

Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.

NOT STARTED.

Currently in standby mode.

Number of jobs executed: 0

Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.

Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2016-07-31-13-13 [main] [org.quartz.impl.StdSchedulerFactory] [INFO] - Quartz scheduler 'scheduler' initialized from an externally provided properties instance.

2016-07-31-13-13 [main] [org.quartz.impl.StdSchedulerFactory] [INFO] - Quartz scheduler version: 2.2.3

2016-07-31-13-13 [main] [org.quartz.core.QuartzScheduler] [INFO] - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@58cdc845

2016-07-31-13-13 [main] [org.springframework.context.support.DefaultLifecycleProcessor] [INFO] - Starting beans in phase 2147483647

2016-07-31-13-13 [main] [org.springframework.scheduling.quartz.SchedulerFactoryBean] [INFO] - Starting Quartz Scheduler now

2016-07-31-13-13 [main] [org.quartz.core.QuartzScheduler] [INFO] - Scheduler scheduler_$_NON_CLUSTERED started.

2016-07-31-13-13 [main] [org.apache.coyote.http11.Http11NioProtocol] [INFO] - Initializing ProtocolHandler ["http-nio-7001"]

2016-07-31-13-13 [main] [org.apache.coyote.http11.Http11NioProtocol] [INFO] - Starting ProtocolHandler ["http-nio-7001"]

2016-07-31-13-13 [main] [org.apache.tomcat.util.net.NioSelectorPool] [INFO] - Using a shared selector for servlet write/read

2016-07-31-13-13 [main] [org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer] [INFO] - Tomcat started on port(s): 7001 (http)

2016-07-31-13-13 [main] [com.alibaba.App] [INFO] - Started App in 1.65 seconds (JVM running for 2.04)

2016-07-31-13-13 [scheduler_Worker-1] [com.alibaba.task.TestTask] [INFO] - 測試任務線程開始執行

2016-07-31-13-14 [scheduler_Worker-2] [com.alibaba.task.TestTask] [INFO] - 測試任務線程開始執行

關注我:私信回覆“架構資料”獲取往期架構視頻


分享到:


相關文章: