1. 程式人生 > >定時任務quartz原理以及配置

定時任務quartz原理以及配置

前些日子有業務需要定時任務,經過了解選擇了quartz

quartz是一個用java實現的開源排程任務框架,有這麼幾個好處

1.配置方便,支援多工

2.業務-定時可控,靈活配置,隨時更改

3.支援分散式叢集

下面是核心元素的關係

在quartz中,Scheduler排程執行緒主要有兩個:regular Scheduler Thread(執行常規排程)和Misfire Scheduler Thread(執行錯失的任務)。其中Regular Thread 輪詢Trigger,如果有將要觸發的Trigger,則從任務執行緒池中獲取一個空閒執行緒,然後執行與改Trigger關聯的job;Misfire Thraed則是掃描所有的trigger,檢視是否有錯失的,如果有的話,根據一定的策略進行處理。

先舉個例子做定時任務配置

引用maven

<dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.2</version>
    </dependency>

先建一個job.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"
	default-autowire="byName">

	<description>job配置</description>

	<!--採用xml配置可讀性比較強 -->
	<!--清空當月報表然後重新生成當月報表 -->
	<bean name="test" class="cn.xxx.schedule.web.job.Test" />
	<bean id="testJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass">
			<value>cn.xxx.schedule.web.util.MyDetailQuartzJobBean</value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<entry key="targetObject" value="test" />
				<entry key="targetMethod" value="run" />
			</map>
		</property>
	</bean>
	<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="testJob" />
		</property>
		<property name="cronExpression">
			<value>0 * * * * ?</value>
		</property>
	</bean>


	<!-- Scheduler集合 工廠bean-->
	<bean id="mapScheduler"
		  class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
		  autowire="no" lazy-init="false">
		<property name="triggers">
			<list>
				<ref local="testTrigger" />
			</list>
		</property>
		<property name="applicationContextSchedulerContextKey" value="applicationContext" />
		<property name="configLocation" value="classpath:quartz.properties" />
		<property name="startupDelay" value="10" /><!-- 延遲載入10秒,即啟動後10秒再執行 -->
	</bean>
</beans>

首先解決JobDetailFactoryBean的問題,在不修改Spring原始碼的情況下,可以避免使用這個類,直接呼叫JobDetail。但是使用JobDetail實現,需要自己實現MothodInvoking的邏輯,可以使用JobDetail的jobClass和JobDataAsMap屬性來自定義一個Factory(Manager)來實現同樣的目的。例如,本示例中新建了一個MyDetailQuartzJobBean來實現這個功能。

import java.lang.reflect.Method;  

import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;  
import org.springframework.scheduling.quartz.QuartzJobBean;

public class MyDetailQuartzJobBean extends QuartzJobBean {  
    private static final Logger logger = LoggerFactory.getLogger(MyDetailQuartzJobBean.class);
    private String targetObject;  
    private String targetMethod;  
    private ApplicationContext ctx;  
  
    @Override  
    protected void executeInternal(JobExecutionContext context)  
            throws JobExecutionException {  
        try {  
            logger.info("execute [" + targetObject + "] at once>>>>>>");  
            Object otargetObject = ctx.getBean(targetObject);  
            Method m = null;  
  
            try {  
                m = otargetObject.getClass().getMethod(targetMethod, new Class[] {JobExecutionContext.class});  
                m.invoke(otargetObject, new Object[] {context});  
            } catch (SecurityException e) {  
                logger.error(e.toString());  
            } catch (NoSuchMethodException e) {  
                logger.error(e.toString());  
            }  
        } catch (Exception e) {  
            throw new JobExecutionException(e);  
        }  
    }  
  
    public void setApplicationContext(ApplicationContext applicationContext) {  
        this.ctx = applicationContext;  
    }  
  
    public void setTargetObject(String targetObject) {  
        this.targetObject = targetObject;  
    }  
  
    public void setTargetMethod(String targetMethod) {  
        this.targetMethod = targetMethod;  
    }
}

JobDetailFactoryBean是job工廠,指定要執行的job類和方法名
Quartz排程一次任務,會幹如下的事:
JobClass jobClass=JobDetail.getJobClass()
Job jobInstance=jobClass.newInstance()。所以Job實現類,必須有一個public的無參構建方法。
jobInstance.execute(JobExecutionContext context)。JobExecutionContext是Job執行的上下文,可以獲得Trigger、Scheduler、JobDetail的資訊
CronTriggerFactoryBean:基於時間刻度(可以設定具體時間,具體設定時間規則下面會說)
jobDetail:job的詳細配置,依賴job工廠

cronExpression:表示式

lazy-init='false'那麼容器啟動就會執行排程程式

triggers:依賴要執行的任務名

 通過applicationContextSchedulerContextKey屬性配置spring上下文

configLocation:本地配置如下給出:

#表示如果某個任務到達執行時間,而此時執行緒池中沒有可用執行緒時,任務等待的最大時間,如果等待時間超過下面配置的值(毫秒),本次就不在執行,而等待下一次執行時間的到來,可根據任務量和負責程度來調整  
org.quartz.jobStore.misfireThreshold=60000

#實現叢集時,任務的儲存實現方式,org.quartz.impl.jdbcjobstore.JobStoreTX表示資料庫儲存,無需修改  
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX

#quartz儲存任務相關資料的表的字首,無需修改   
org.quartz.jobStore.tablePrefix=QRTZ_

#連線資料庫資料來源名稱,與下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以無需修改    
org.quartz.jobStore.dataSource=myDS

#是否啟用叢集,啟用,改為true,注意:啟用集群后,必須配置下面的資料來源,否則quartz排程器會初始化失敗     
org.quartz.jobStore.isClustered=true

#叢集中伺服器相互檢測間隔,每臺伺服器都會按照下面配置的時間間隔往伺服器中更新自己的狀態,如果某臺伺服器超過以下時間沒有checkin,排程器就會認為該臺伺服器已經down掉,不會再分配任務給該臺伺服器  
org.quartz.jobStore.clusterCheckinInterval=10000

#==============================================================    
#Non-Managed Configure Datasource    
#==============================================================  

#配置連線資料庫的實現類,可以參照IAM資料庫配置檔案中的配置     
org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver

#配置連線資料庫連線,可以參照IAM資料庫配置檔案中的配置    
org.quartz.dataSource.myDS.URL=jdbc:mysql://xxx:3306/quartz

#配置連線資料庫使用者名稱  
org.quartz.dataSource.myDS.user=aa

#配置連線資料庫密碼  
org.quartz.dataSource.myDS.password=bbbbb

#配置連線資料庫連線池大小,一般為上面配置的執行緒池的2倍  
artz.dataSource.myDS.maxConnections=10

下面是指定執行業務的任務,有什麼話就來這裡說吧

@Slf4j
public class Test{

	public void run(JobExecutionContext context){
		log.info("開始執行定時任務");


		log.info("完成定時任務!");
	}
}

下面是表結構

表名 描述
QRTZ_CALENDARS 以 Blob 型別儲存 Quartz 的 Calendar 資訊
QRTZ_CRON_TRIGGERS 儲存 Cron Trigger,包括 Cron 表示式和時區資訊
QRTZ_FIRED_TRIGGERS 儲存與已觸發的 Trigger 相關的狀態資訊,以及相聯 Job 的執行資訊
QRTZ_PAUSED_TRIGGER_GRPS 儲存已暫停的 Trigger 組的資訊
QRTZ_SCHEDULER_STATE 儲存少量的有關 Scheduler 的狀態資訊,和別的 Scheduler 例項(假如是用於一個叢集中)
QRTZ_LOCKS 儲存程式的非觀鎖的資訊(假如使用了悲觀鎖)
QRTZ_JOB_DETAILS 儲存每一個已配置的 Job 的詳細資訊
QRTZ_JOB_LISTENERS 儲存有關已配置的 JobListener 的資訊
QRTZ_SIMPLE_TRIGGERS 儲存簡單的 Trigger,包括重複次數,間隔,以及已觸的次數
QRTZ_BLOG_TRIGGERS Trigger 作為 Blob 型別儲存(用於 Quartz 使用者用 JDBC 建立他們自己定製的 Trigger 型別,JobStore 並不知道如何儲存例項的時候)
QRTZ_TRIGGER_LISTENERS 儲存已配置的 TriggerListener 的資訊
QRTZ_TRIGGERS 儲存已配置的 Trigger 的資訊

可以在qrtz_cron_triggers這個表定時每天執行時間,比如說這個

CRON_EXPRESSION這個欄位,是按秒分時天月的順序設定時間的,TRIGGER_NAME對應對應的任務

第一個含義:每天下午6點執行,第二個含義每天晚上兩點半執行

qrtz_triggers這個表是詳細對應關係,如果要改動下次執行時間,可以更改NEXT_FIRE_TIME

相關推薦

定時任務quartz原理以及配置

前些日子有業務需要定時任務,經過了解選擇了quartz quartz是一個用java實現的開源排程任務框架,有這麼幾個好處 1.配置方便,支援多工 2.業務-定時可控,靈活配置,隨時更改 3.支援分散式叢集 下面是核心元素的關係 在quartz中,Schedu

定時任務的使用以及配置

在我們做java開發中,常常需要用到定時任務,就是在某個特定時間段執行你需要的功能,特別是在第三方支付中,在使用者使用你的某些功能如:提現,轉賬等等,會用到T+1來給使用者做交易,這裡就需要定時任務。 T+1:T指的是今天,例如,你今天做了一筆交易,規定T+1到賬,就是說明天會到賬。當然,T+1

spring多個定時任務quartz配置

ram 至少 utf-8 list 表達 lse 第一個 span cron spring多個定時任務quartz配置 1 <?xml version=”1.0″ encoding=”UTF-8″?> 2 <beans xmlns=”http:/

Spring整合quartz定時任務排程的cronExpression配置說明(轉載)

Spring整合quartz定時任務排程 "* * * * * *" 欄位   允許值   允許的特殊字元 秒   

java定時任務 Quartz時間配置

 java Quartz定時器任務與Spring task定時的幾種實現 基於java 的定時任務實現, Quartz 時間詳細配置    請查閱   http://www.cnblogs.com/sihuanian/p/5010872.html

spring整合quartz實現動態定時任務的前臺網頁配置與管理

在實際專案應用中經常會用到定時任務,可以通過quartz和spring的簡單配置即可完成,但如果要改變任務的執行時間、頻率,廢棄任務等就需要改變配置甚至程式碼需要重啟伺服器,這裡介紹一下如何通過quartz與spring的組合實現動態的改變定時任務的狀態的一個實

spring boot 整合定時任務quartz配置

<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1

Quartz定時任務執行原理分析

1.定時任務執行原理 在java中常見的定時排程方案有:ScheduledExecutorService和quartz兩種方案。其本質上都是通過native的wait方法來實現的. 1.1 ScheduledExecutorService定時執行原理

使用java配置定時任務的幾種配置方式及示例

遞增 exc trigge strong trigger except 字符 ssi uart Spring定時器,主要有兩種實現方式,包括Java Timer定時和Quartz定時器! 1.Java Timer定時 首先繼承java.util.TimerTask類實現

Linux DHCP原理以及配置

toc 配置ip地址 src 安裝 包括 strong 其它 prot 第一個 DHCP作用   DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是一個局域網的網絡協議,使用UDP協議工作, 主要有兩個用途:給內部網絡或網

石英定時任務-quartz

take 技術 java jobdetail als 獲取 狀態 技術分享 ide <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/

linux kdump原理以及配置

通過 空間 4.0 config 內核啟動 完成 linux內核 捕獲 以及 相關的原理kexec是一個快速啟動機制,允許通過已運行的內核的上下文啟動一個linux內核,不需要經過BIOS。實現kdump機制的關鍵,包括二個組成部分:一是內核空間的系統調用kexec_loa

springboot專案整合分散式定時任務Quartz

springboot中整合分散式定時任務Quartz的模本範例。參考這個配置,十分簡便 兩個bean配置,一個properties檔案,一個sql檔案,使用的為mysql. QRTZ_tables_mysql_innodb.sql # # In your Quartz properties

定時任務quartz與spring整合(springboot)

設定beanFactory以及建立job package cm.wesure.task; import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.BeansException; import org

33、生鮮電商平臺-定時器,定時任務quartz的設計與架構

說明:任何業務有時候需要系統在某個定點的時刻執行某些任務,比如:凌晨2點統計昨天的報表,早上6點抽取使用者下單的佣金。           對於Java開源生鮮電商平臺而言,有定時推送客戶備貨,定時計算賣家今日的收益,定時提醒每日的提現金額等等  

34. springboot動態配置定時任務(通過資料庫配置

1、pom.xml檔案 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

java web定時任務---quartz

寫在前面:   前面有簡單的記錄下Timer定時的用法,但是在此次專案中,選擇的是quartz來完成定時操作任務的。兩者都可以完成定時操作,但是spring可以整合quartz,並且配置起來也比較簡便,還可以同時跑多個任務。就選擇了quartz,quartz的用法也很強大,

java版定時任務quartz【石英鐘】

我的疑問? 怎麼實現job和trigger的可配置呢? 例如我想執行一個類,但是呢?如果這個類定義了,是不是就固定了?除非可以額外傳引數,google下真的可以傳引數。【How to pass i

電商平臺-定時器,定時任務quartz的設計與架構

說明:任何業務有時候需要系統在某個定點的時刻執行某些任務,比如:凌晨2點統計昨天的報表,早上6點抽取使用者下單的佣金。           對於Java開源生鮮電商平臺而言,有定時推送客戶備貨,定時計算賣家今日的收益,定時提醒每日的提現金額等等

定時任務 Quartz Cron表示式

cron最初是unix中基於時間的作業排程程式。 cron表示式是由空格分隔的6或7個域組成的字串。域中可以包含任何允許的值,包括含有特殊字元的組合值。cron表示式可以有如下兩種格式(實際使用中為了簡