日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Quartz 入门

發布時間:2024/9/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Quartz 入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

可以用來創建執行數十,數百乃至數萬個作業的簡單或復雜的計劃;開源的完全使用JAVA開發的一種時間調度框架,可多線程同步執行。支持集群、JTA事務(聽著好高大上,說白了就是定時器~,與以往不同的是,他支持大量的定時任務同步執行,還可以將定時信息保存到數據庫中在需要的時候在開啟執行,可以防止數據丟失,也可以隨時查看定時任務的信息)

使用

quartz 下載地址:?http://www.quartz-scheduler.org/downloads/?

quartz有兩種使用方式:RAM、JDBC。任務的調度也有兩種方式:SimpleSchedule、CronSchedule

RAM方式:

程序直接運行在內存中

1、導入 Quartz 的jar包,官網有zip文件可供下載,maven 項目則需要導入依賴

<!-- quartz begin --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency> <!-- quartz end --><!-- log --><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency>

2、創建 quartz.properties? 文件放到 classpath 中

#JDBC驅動
#org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
#org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/test
#org.quartz.dataSource.qzDS.user:root
#org.quartz.dataSource.qzDS.password:
#org.quartz.dataSource.qzDS.maxConnection:10

org.quartz.scheduler.instanceName=MyScheduler
org.quartz.threadPool.threadCount=3
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

3、創建具體的任務

package com.quartz.first;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException;public class MyJob implements Job {private static final String NAME = "name";@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println(" execute job() ... ");}}

調用

package com.quartz.first;import java.util.Date;import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory;/*** * 使用 RAM 方式定時* * @author 豐志**/ public class RAMQuartz {public static void main(String[] args) throws SchedulerException {//1.創建Scheduler的工廠SchedulerFactory schedulerFactory = new StdSchedulerFactory();//2.從工廠中獲取調度器實例Scheduler scheduler = schedulerFactory.getScheduler();//3.創建JobDetailJobDetail jobDetail = JobBuilder.newJob(MyJob.class).withDescription("this is a ram job") //job的描述.withIdentity("ramJob", "ramGroup") //job 的name和group .build();// jobDetail.getJobDataMap().put("name", "zhangsan"); //傳參用與MyJob中獲取參數 jobDataMap.get("name")//任務運行的時間,SimpleSchedle類型觸發器有效long time= System.currentTimeMillis() + 3*1000L; //3秒后啟動任務Date statTime = new Date(time);//4.創建Trigger//使用SimpleScheduleBuilder或者CronScheduleBuilderTrigger trigger = TriggerBuilder.newTrigger().withDescription("").withIdentity("ramTrigger", "ramTriggerGroup").startAt(statTime) //默認當前時間啟動 // .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(10)) // 每個2秒鐘執行一次,一共執行10次 // .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //兩秒執行一次,cron 秒、分、時、日、月、年、 .build();//5.注冊任務和定時器 scheduler.scheduleJob(jobDetail, trigger);//6.啟動 調度器 scheduler.start();} }

?結果:

到此就實現了基本的調度任務,但是在實際項目中往往需要用到quartz跟一些開發框架的集成

spring集成quartz

?  使用spring框架來管理quartz可以使開發變得簡單,只需要書寫具體的任務即可,因為不在需要寫JAVA代碼來開啟任務,spring會根據配置文件中的配置自動開啟省去了手寫的調度過程。具體實現:

1、添加 spring 支持(添加之前的依賴):

<dependency> <groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version> </dependency>

2、創建具體的任務

Simple方式:

package org.quartz.demo;import java.util.Date;import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean;public class SimpleJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {System.out.println("------ 執行ExampleJob -------" + new Date());} }

Cron方式:

package org.quartz.demo;import java.util.Date;public class CronJob {public void doIt() {System.out.println("====== 執行 ExampleBusinessObject.doIt... ======" + new Date());} }

3、配置 spring-quartz.xml 文件:

spring 的applicationContext.xml文件中添加quartz:

<import resource="classpath:conf/spring-quartz.xml" />

配置 spring-quartz.xml

Simple方式:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"><!-- 具體執行的任務 --> <bean name="simpleJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="org.quartz.demo.SimpleJob"/></bean><!-- Simple觸發器 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"><property name="jobDetail" ref="simpleJob"/><property name="startDelay" value="50000"/><property name="repeatInterval" value="5000"/></bean> <!-- 調度工廠 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="simpleTrigger"/></list></property></bean></beans>

Cron方式:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"><!-- 具體的任務 --><bean id="cronJob" class="org.quartz.demo.CronJob"/><!-- JobDetail --><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="cronJob"/><property name="targetMethod" value="doIt"/></bean><!-- Cron觸發器 --><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail"/><property name="cronExpression" value="10 * * * * ?"/> </bean> <!-- 調度工廠 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger"/></list></property></bean></beans>

啟動 tomcat 測試結果

Cron.doIt 每分鐘的第 10 秒執行一次, SimpleJob 每 5 秒鐘執行一次。兩個任務可以同時調度。測試通過~

JDBC方式:

如果需要使用 JDBC模式需要下載官方的資料,進入 quartz-2.2.3 / docs / dbTables 里面有所有的 sql 文件,可以執行具體的 sql 生成需要的數據表,數據表只有在使用 JDBC 模式的情況下才有效,這里只是初步的記錄下quartz的使用。

1、根據官方文檔提供的 sql 生成相應的數據表

在下載文件夾下進入 quartz-2.2.3 / docs / dbTables 執行相應的 sql 生成對應的數據表

其中常用的

  qrtz_cron_tiggers:  記錄使用 CRON 表達式定義的觸發器

  qrtz_fired_triggers:  記錄觸發器的執行時間

  qrtz_job_details:  記錄具體任務的名稱,組,類名等信息

  qrtz_simple_triggers:  記錄使用 Simple 方式定義的觸發器

  qrtz_triggers:  記錄觸發器執行的詳細信息,包括任務的名稱、組,觸發器的名稱、組以及觸發器的開始執行時間、上次執行的時間和下一次執行的時間等信息

2、配置 quartz.properties 放到 classpath 目錄下

org.quartz.threadPool.threadCount=3 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.dataSource = myDSorg.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/test org.quartz.dataSource.myDS.user = root org.quartz.dataSource.myDS.password = org.quartz.dataSource.myDS.maxConnections = 30

在這兒只列舉基本的配置,詳細的參考:? http://www.quartz-scheduler.org/documentation/quartz-2.1.x/configuration/?

3、配置具體的任務

package com.quartz.first;import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException;public class MyJob implements Job {private static final String NAME = "name";@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println(" execute jdbcJob() ... ");}}

4、調用測試

package com.quartz.first;import java.util.List;import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory;public class JDBCQuartz {public static void main(String[] args) throws SchedulerException {startSchedule(); //開始執行定時任務,同時會向數據庫寫入任務、觸發器、調度等數據//resumeJob(); // 重新執行 }private static void startSchedule() {try {// 1、創建JobDetail實例JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();// 2、設置觸發器類型 、執行次數 // SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.repeatSecondlyForTotalCount(5);CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");// 3、創建TriggerTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(cronScheduleBuilder).build();// 4、創建SchedulerScheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();// 5、調度執行 scheduler.scheduleJob(jobDetail, trigger);try {Thread.sleep(60000);} catch (InterruptedException e) {e.printStackTrace();}// 關閉調度器// scheduler.shutdown(); } catch (SchedulerException e) {e.printStackTrace();}}/** 從數據庫中找到已經存在的job,并重新開戶調度 */private static void resumeJob() {try {SchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();JobKey jobKey = new JobKey("job1", "group1");List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);if (triggers.size() > 0) {for (Trigger tg : triggers) {// 根據類型判斷if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) {// 恢復job運行 scheduler.resumeJob(jobKey);}}scheduler.start();}} catch (Exception e) {e.printStackTrace();}} }

運行結果:

數據庫:

?

?

關閉服務,執行修改代碼執行resumeJob():??

一秒鐘執行了這么多次,調用成功。

到此基本的使用應該沒什么問題了? ?(~ ̄▽ ̄ ~)

源碼: https://files.cnblogs.com/files/guofz/myFirstQuartz.rar

Quartz官方介紹:??http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

Spring官方文檔介紹集成 Quartz 地址:https://docs.spring.io/spring/docs/4.3.17.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/

最后:歡迎吐槽指正~?

?

轉載于:https://www.cnblogs.com/guofz/p/8963367.html

總結

以上是生活随笔為你收集整理的Quartz 入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。