1. 程式人生 > >Quartz-Spring整合Quartz通過XML配置的方式

Quartz-Spring整合Quartz通過XML配置的方式

概述

Spring為建立Quartzde Scheduler、Trigger和JobDetail提供了方便的FactoryBean類,以便能夠在Spring容器中享受注入的好處。

此外,Spring還通了一些便利的工具類,用於直接將Spring中的Bean包裝成合法的任務。

Spring進一步降低了使用Quartz的難度,能夠以更加Spring風格的方式使用Quartz,主要體現在如下兩點

  • 為Quartz的重要元件提供更具Bean風格的擴充套件類

  • 提供建立Scheduler的BeanFactory類,方便在Spring環境下建立對應的元件物件,並結合Spring容器生命週期執行啟動和停止的動作

Maven依賴

主要的兩個依賴如下:

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

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

spring-context-support包主要是Spring集成了很多有用的第三方庫,我們在使用第三方的東西的時候一般都需要引入該依賴。

步驟

Spring通過xml的方式整合Quartz,主要有兩種方式

  1. JobDteail通過JobDetailBean實現

  2. JobDteail通過MethodInvokeJobDetailFactoryBean實現(推薦)

1 建立JobDteail

Spring通過擴充套件JobDetail提供了一個更具Bean風格的JobDetailFactoryBean,此外Spring還提供了了一個 MethodInvokingJobDetailFactoryBean,通過這個FactoryBean可以將Spring容器中的Bean的方法包裝成Quartz任務,這樣我們就不必為Job建立對應的類。

案例中會分別講述兩種實現方式的區別

2 建立Trigger

Quartz中另外一個重要的元件就是Trigger,Spring按照相似的思路分別為SimpleTrigger和CronTrigger提供了更具Bean風格的CronTriggerFactoryBean和SimpleTriggerFactoryBean擴充套件類。

3 建立Scheduler

Quartz的SchedulerFactory是標準的工廠類,不太適合在Spring中使用。 此外為了保證Scheduler能夠感知Spring容器的生命週期,在Spring容器啟動後,Scheduler自動開始工作,而在Spring容器關閉前,自動關閉Scheduler。為此Spring提供了SchedulerFactoryBean.

示例-MethodInvokingJobDetailFactoryBean

這裡寫圖片描述

因為下面的案例中我們使用MethodInvokingJobDetailFactoryBean,所以下面的這個Job無需繼承任何類或者實現任何介面

模擬業務類

配置成一個普通的java類即可

package com.xgj.quartz.quartzWithSpring.xml;


/**
 * 
 * 
 * @ClassName: MyJob
 * 
 * @Description: 不用繼承Quartz的Job介面
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年11月10日 下午10:17:26
 */
public class MyJob {

    public void execute() {
        System.out.println("Quartz Spring XML 配置 - MyJob");
    }

}

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置Job類 -->
    <bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean>

    <!-- 配置JobDetail -->
    <bean id="springQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 執行目標job -->
        <property name="targetObject" ref="myJob"></property>

        <!-- 要執行的方法 -->
        <property name="targetMethod" value="execute"></property>
    </bean>

    <!-- 配置tirgger觸發器 -->
    <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- jobDetail -->
        <property name="jobDetail" ref="springQtzJobMethod"></property>

        <!-- cron表示式,執行時間  每5秒執行一次 -->
        <property name="cronExpression" value="0/5 * * * * ?"></property>
    </bean>

    <!-- 配置排程工廠 -->
    <bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTriggerFactoryBean"></ref>
            </list>
        </property>

    </bean>
</beans>

除了使用CronTrigger也可以使用SimpleTrigger配置,示例程式碼如下

<bean id="simpleTrigger"  class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <!--配置具體要執行的jobDetail-->
    <property name="jobDetail" ref="simpleJobDetail" />
    <!--初始延遲時間 1s-->
    <property name="startDelay" value="1000" />
    <!--間隔執行時間每2s執行一次-->
    <property name="repeatInterval" value="2000" />
</bean>

測試類

package com.xgj.quartz.quartzWithSpring.xml;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringQuartzXmlTest {

    public static void main(String[] args) {
        // 啟動Spring 容器
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
                        "classpath:com/xgj/quartz/quartzWithSpring/xml/application.xml");
        System.out.println("initContext successfully");
    }
}

在排程器中,有一個lazy-init引數,如果lazy-init=’false’,則容器啟動時就會執行排程程式;如果lazy-init=’true’,則需要例項化該bean才能執行排程程式;

<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="true">

執行結果

2017-11-11 02:03:41,399  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org[email protected]174580e6: startup date [Sat Nov 11 02:03:41 BOT 2017]; root of context hierarchy
2017-11-11 02:03:41,481  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/quartz/quartzWithSpring/xml/application.xml]
INFO  StdSchedulerFactory - Using default implementation for ThreadExecutor
INFO  SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO  QuartzScheduler - Quartz Scheduler v.2.2.3 created.
INFO  RAMJobStore - RAMJobStore initialized.
INFO  QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' 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.

INFO  StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance.
INFO  StdSchedulerFactory - Quartz scheduler version: 2.2.3
INFO  QuartzScheduler - JobFactory set to: org.springframework.[email protected]7fe0dbb6
2017-11-11 02:03:42,862  INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647
2017-11-11 02:03:42,862  INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now
INFO  QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started.
initContext successfully
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
Quartz Spring XML 配置 - MyJob
.......
.......
.......
.......

示例-JobDetailFactoryBean

這裡寫圖片描述

業務Job模擬類

package com.xgj.quartz.quartzWithSpring.xml2;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 * 
 * 
 * @ClassName: MyJob2
 * 
 * @Description: 配置檔案中使用JobDetailBean,這是業務Job需要繼承QuartzJobBean
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年11月12日 上午7:54:28
 */
public class MyJob2 extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext ctx)
            throws JobExecutionException {
        System.out.println("Spring 整合 Quartz 的第二種方式");
    }

}

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置Job類 -->
    <bean id="myJob" class="com.xgj.quartz.quartzWithSpring.xml.MyJob"></bean>

    <!-- 配置JobDetail -->
     <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.xgj.quartz.quartzWithSpring.xml2.MyJob2"></property>
        <property name="durability" value="true"></property>
    </bean>


    <!-- 配置tirgger觸發器 -->
    <bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- jobDetail -->
        <property name="jobDetail" ref="jobDetail"></property>

        <!-- cron表示式,執行時間  每5秒執行一次 -->
        <property name="cronExpression" value="0/5 * * * * ?"></property>
    </bean>

    <!-- 配置排程工廠 如果將lazy-init='false'那麼容器啟動就會執行排程程式 -->
    <bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTriggerFactoryBean"></ref>
            </list>
        </property>

    </bean>
</beans>

測試類

package com.xgj.quartz.quartzWithSpring.xml2;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringQuartzXmlTest {

    public static void main(String[] args) {
        // 啟動Spring 容器
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/quartz/quartzWithSpring/xml2/spring-quartz.xml");
        System.out.println("initContext successfully");
    }
}

執行結果

2017-11-12 08:14:27,934  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org[email protected]4af6178d: startup date [Sun Nov 12 08:14:27 BOT 2017]; root of context hierarchy
2017-11-12 08:14:28,014  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/quartz/quartzWithSpring/xml2/spring-quartz.xml]
INFO  StdSchedulerFactory - Using default implementation for ThreadExecutor
INFO  SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO  QuartzScheduler - Quartz Scheduler v.2.2.3 created.
INFO  RAMJobStore - RAMJobStore initialized.
INFO  QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'springJobSchedulerFactoryBean' 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.

INFO  StdSchedulerFactory - Quartz scheduler 'springJobSchedulerFactoryBean' initialized from an externally provided properties instance.
INFO  StdSchedulerFactory - Quartz scheduler version: 2.2.3
INFO  QuartzScheduler - JobFactory set to: [email protected]404f4560
2017-11-12 08:14:28,800  INFO [main] (DefaultLifecycleProcessor.java:343) - Starting beans in phase 2147483647
2017-11-12 08:14:28,801  INFO [main] (SchedulerFactoryBean.java:645) - Starting Quartz Scheduler now
INFO  QuartzScheduler - Scheduler springJobSchedulerFactoryBean_$_NON_CLUSTERED started.
initContext successfully
Spring 整合 Quartz 的第二種方式
Spring 整合 Quartz 的第二種方式
Spring 整合 Quartz 的第二種方式
Spring 整合 Quartz 的第二種方式
Spring 整合 Quartz 的第二種方式
.......
.......
.......

示例原始碼

相關推薦

Quartz-Spring整合Quartz通過XML配置方式

概述 Spring為建立Quartzde Scheduler、Trigger和JobDetail提供了方便的FactoryBean類,以便能夠在Spring容器中享受注入的好處。 此外,Spring還通了一些便利的工具類,用於直接將Spring中的

cors跨域請求問題 關於spring -springmvc -mybatis .基於xml配置方式

1:場景還原     今天要寫一個方法, 需求是  在購物車服務上,  呼叫一個個人中心的方法 ,用到了 跨域請求.      我就在個人中心的 上面寫了個方法, 並在springMVC.xml中,配置了    &

Spring boot + Mybatis(基於xml配置方式) WEB專案

一.工具(idea) 二.建立專案 最後finish; 3.配置與編寫demo     目錄: 3.1 springBoot配置檔案:application.yml;也可使用properties檔案 spring: #資料來源配置 datas

spring專案中通過xml配置快取(cache)記錄貼

配置一個spring預設實現的快取(cache)<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:

spring整合中application.xml配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springfr

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

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

Spring整合Quartz的3種方式

1.使用xml配置方式 Maven依賴 <properties> <!-- spring版本號 --> <spring.version>4.2.2.RELEASE</spring.version>

Spring整合Quartz案例使用JDBC儲存方式

目錄 建立資料庫表 配置資料庫連線池 建立工作類 工作類中呼叫的業務類  工作類 配置JobDetail和Trigger,並交給Scheduler註冊 測試 Quartz叢集中如何工作 Quartz叢集環境下配置 quartz.properties

Spring整合Quartz案例使用RAM儲存方式

spring整合quartz有兩種任務儲存方式,RAM儲存方式和JDBC儲存方式,企業開發使用的JDBC儲存方式。 先從RAM儲存方式開始說起  目錄 Jar包依賴 quartz-config.xml 建立jobDetail 依賴org.springframewor

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

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

Spring整合Hibernate管理事務(xml配置方式

之前是剛開始使用Spring的事務管理,採用比較簡單方便的註解方式進行事務處理,而註解方式進行事務處理需要在每一個要實現事務的類上新增@Transactional註解,在比較小的專案中可以這樣來用。但是在大型專案中,註解方式管理事務不夠清晰,無法判斷哪裡開啟了事務,必須一一

Spring mvc通過xml配置檔案方式實現簡單HelloWorld

實現Spring MVC有兩種不同的方式:基於XML配置檔案和基於註解。 這裡,我們使用XML檔案的方式來實現。 首先,我們需要在Eclipse或者是MyEclipse中新建一個web專案,並將Spr

初識quartz 並分析 項目中spring整合quartz配置【原創+轉載】

text lca 目的 並發 目錄結構 public 項目 功能 基於 初識quartz 並分析 項目中spring整合quartz的配置【原創+轉載】2018年01月29日 12:08:07 守望dfdfdf 閱讀數:114 標簽: quartz 更多個人分類: 工具 軟

day39-Spring 11-Spring的AOP:基於AspectJ的XML配置方式

asp 技術 mage bsp aop src xml配置方式 img aspectj day39-Spring 11-Spring的AOP:基於AspectJ的XML配置方式

Spring整合quartz實現定時動態任務

comm 通過 app 定時器 表示 時間 con 任務 images 在Spring中使用Quartz有兩種方式實現:第一種是任務類繼承QuartzJobBean,第二種則是在配置文件裏定義任務類和要執行的方法,類和方法可以是普通類。很顯然,第二種方式遠比第一種方式來的靈

Spring quartz Job不能依賴註入,Spring整合quartz Job任務不能註入

nbsp too upd ticket enter java代碼 rec onf 2.3 Spring quartz Job不能依賴註入,Spring整合quartz Job任務不能註入 Spring4整合quartz2.2.3中Job任務使用@Autowired不能註入

Spring整合quartz關閉,關閉Tomcat Servlet容器時內存泄漏

read 還在 iss 出錯 appears 定時器線程 span img tro 出錯信息 22-Sep-2017 06:19:51.064 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBas

spring整合Quartz定時器

() void java類 info throws tex execute new protect 第一種:為普通java類中的某個方法配置跑批任務 1.定義要跑批的類和方法: package com.xy.utils.quartz; import org.joda.t

Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境)

foreign log ride bigint post 業務 設置 ade 營業額 Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境) 轉載:http://www.cnblogs.com/jiafuwei/p/6145280.

Spring 基於xml配置方式的AOP(8)

復制 calc owin img add ann frame proc message 1、ArithmeticCalculator.java 1 package com.proc; 2 3 public interface ArithmeticCalculator