1. 程式人生 > 實用技巧 >quartz開源任務排程框架

quartz開源任務排程框架

1.Quartz是什麼?

Quartz官方網站:http://www.quartz-scheduler.org
1. Quartz是一個功能豐富的、開源任務排程框架,幾乎可以整合到任何Java應用中,小 到單體引用,大到大型電子商務系統;

2. Quartz可以用來建立和執行成千上萬的簡單或複雜排程任務;

3. Quartz的任務被定義成一組標準的Java元件,幾乎可以執行任何程式設計任務;

4. Quartz包含很多企業級功能,包括JTA事務(分散式事務)和叢集

2.Quartz可以做什麼

1. 定時傳送郵件、簡訊

2. 定時進行資料同步

3. 定時刪除超時訂單

3.Quartz的核心API

1. Job:你想要排程器執行的任務元件需要實現的介面

2. JobDetail:描述任務詳細細節(描述任務名稱、任務組)

3. JobBuilder:使用者建立JobDetail

4. Trigger:定義任務的排程時機(規則)
SimpleTrigger:定義任務開始時間、結束時間、每隔多長時間執行、執行多少次、 執行多久
CronTrigger:使用Cron表示式定義執行規則

5. TriggerBudiler:建立Trigger觸發器
6. Scheduler:使用Trigger定義規則去排程(執行)任務

7. JobDataMap:JobDetail和Trigger可以通過它給Job傳遞引數


8. JobKey:封裝了Job的name和group("工作的名稱", "工作的組") TriggerKey:("觸發器的名稱", "觸發器的組")

9. JobExectionContext

4.程式碼

4.1建立Quartz的過程
First

package com.etoak.simple; import com.etoak.job.HelloJob; import org.quartz.
*; import org.quartz.impl.StdSchedulerFactory; public class First { public static void main(String[] args) throws SchedulerException {
//1.建立jobDetail //JObKey封裝了Job的name和group JobKey jobKey = new JobKey("hello","hello"); //定義工作並將其繫結到我們的HelloJob類 //.withIdentity("工作的名稱", "工作的組") JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)//建立了一個JobDetail,繫結任務job .withIdentity(jobKey) .build(); //2.建立Trigger(觸發器)==>定義規則 TriggerKey triggerKey = new TriggerKey("hello","hello"); //TriggerBuilder - 用於定義/構建觸發器例項。 //.withIdentity("觸發器的名稱", "觸發器的組") SimpleTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) .withSchedule(SimpleScheduleBuilder //SimpleScheduleBuilder是簡單呼叫觸發器,它只能指定觸發的間隔時間和執行次數; .simpleSchedule()//建立一個SimpleScheduleBuilder .withIntervalInSeconds(5)//每個五秒執行一次 .repeatForever()//一直執行 ).build(); //3.建立Scheduler==>執行Trigger定義的規則 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(jobDetail,trigger); scheduler.start(); } }
==========================================================================================================================================
Second
package com.etoak.simple;
import com.etoak.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Second {

public static void main(String[] args) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("hello").build();
Date current = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("當前時間->" + sdf.format(current));
Date date = new Date(current.getTime() + 5000L);

SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("hello")
.startAt(date)//表示觸發器首次被觸發的時間;
.withSchedule(SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(5)//每個五秒執行一次
.withRepeatCount(10)//執行十次,加上第一次是十一次
).build();

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
==============================================================================================================================
Third
package com.etoak.simple;
import com.etoak.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

public class Third {
public static void main(String[] args) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("hello")
.build();
//獲取30秒後的時間
Date date = new Date(System.currentTimeMillis() + 1000L * 30);
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("hello")
.endAt(date)//30秒後結束
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)
.repeatForever()
).build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
===========================================依賴===================================================================

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.etoak.et2006.quartz</groupId>
<artifactId>quartz-java</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<!--quartz依賴-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<!--日誌-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>

</project>

5.測試Cron表示式

package com.etoak.cron;

import com.etoak.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class CronTest  {
    public static void main(String[] args) throws SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("hello")//身份資訊
                .build();

        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("hello")
                .withSchedule(
                        CronScheduleBuilder//.cronSchedule("*/5 * * * * ?")//秒分時天月周
                        //.cronSchedule("0 33 11 ? * MON-FRI")
                         .cronSchedule("0 0/1 11 ? * MON-FRI")
                ).build();

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.scheduleJob(jobDetail,trigger);
        scheduler.start();

    }

}

6.Spring整合單機版Quartz

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
<!--單機版-->
    <!--1.建立任務類-->
    <bean id="emailJob" class="com.etoak.job.EmailJob" />
    <!--2.JobDetail-->
    <bean id="emailJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 任務名稱和任務組名稱 -->
        <property name="name" value="emailJob" />
        <property name="group" value="emailJob" />
        <!-- 執行的目標任務物件(spring bean) -->
        <property name="targetObject" ref="emailJob" />
        <!--任務物件的方法-->
        <property name="targetMethod" value="sendEmail" />
    </bean>
    <!--3.Trigger-->
    <bean id="emailTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="emailTrigger" />
        <property name="group" value="emailTrigger" />
        <property name="jobDetail" ref="emailJobDetail"/>
        <property name="cronExpression" value="*/5 * * ? * *" />
    </bean>

    <!--4.排程-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="emailTrigger" />
            </list>
        </property>
    </bean>
</beans>

7.Spring整合叢集版Quartz(要求任務物件必須extends QuartzJobBean)

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
<!--叢集版-->
    <!--資料來源-->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/et2006" />
        <property name="username" value="root" />
        <property name="password" value="etoak" />
    </bean>

    <!-- 事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- JobDetailFactoryBean -->
    <bean id="orderJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="name" value="orderJob" />
        <property name="group" value="orderJob" />
        <!--jobClass-->
        <property name="jobClass" value="com.etoak.job.OrderJob" />
        <!--durability:持久化任務-->
        <property name="durability" value="true" />
    </bean>

    <!-- CronTriggerFactoryBean -->
    <bean id="orderTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="orderTrigger" />
        <property name="group" value="orderTrigger"/>
        <property name="jobDetail" ref="orderJobDetail" /><!--ref寫成了value-->
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>

    <!-- SchedulerFactoryBean -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <!-- 叢集配置 -->
        <property name="configLocation" value="classpath:quartz.properties" />
        <property name="triggers">
            <list>
                <ref bean="orderTrigger" />
            </list>
        </property>
        <!--第一種-->
        <property name="applicationContextSchedulerContextKey" value="delete" />
        <!--第二種-->
        <property name="jobFactory" ref="mvcJobFactory" />
    </bean>
</beans>
================================兩種整合用到的依賴===============================================
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.etoak.et2006.quartz</groupId>
<artifactId>quartz-springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>quartz-springmvc Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<!-- javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>

<!-- spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>

<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>

<!-- jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>

<!-- logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>

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

<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>

<build>
<finalName>quartz-springmvc</finalName>
</build>
</project>
==============================web.xml===================================================
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<!-- spring Root容器(父容器) -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-root.xml</param-value>
</context-param>
<!-- POST請求編碼過濾器 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<listener><!--監聽器--><!--webapp爆紅因為違反了dtd規範(標籤順序問題)-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 前端控制器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>