Quartz任務調度實踐

最近在寫一個任務調度程序,須要每隔幾秒查詢數據庫,並取出數據作一些處理操做。使用到了Quartz任務調度框架。html

基本概念

Quartz包含幾個重要的對象,分別爲任務(Job),觸發器(Trigger),調度器(Scheduler)java

  • Job:一個接口只有一個方法void execute(),咱們須要執行的任務就須要實現這個接口,在execute中實現咱們要作的事情。
  • JobDetail:在Quartz執行每次執行Job時,都須要建立一個Job實例,因此它直接接受一個實現類以便運行時實例化,還須要一個描述信息,JobDetail就是作這個事情。建立JobDetail方法以下:
    JobBuilder builder=JobBuilder.newJob(SimpleJob.class);
    JobDetail jobDetail=builder.build();
    經過JobBuilder能夠設置一些描述,好比builder.withIdentity(name,group)等等
  • Trigger:是一個抽象類,描述觸發執行的時間,它主要有SimpleTrigger和CronTrigger這兩個子類,當僅需觸發一次或者以固定時間間隔週期執行,SimpleTrigger是最適合的選擇;而CronTrigger則能夠經過Cron表達式定義出各類複雜時間規則的調度方案:如每早晨9:00執行,周1、周3、週五下午5:00執行等;
  • Scheduler:能夠認爲是quartz的調度器,咱們把JobDetail和Trigger註冊到Scheduler,由它調度運行。

一個簡單的例子

直接使用quartz實現一個簡單的例子。
1.建立一個SimpleJob類,實現Job接口spring

public class SimpleJob implements Job{
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("執行了一個Job"+jobExecutionContext.getJobDetail().getDescription());
    }
}

2.使用SimpleJob建立一個JobDetail實例數據庫

//建立一個JobDetail實例
        JobBuilder builder=JobBuilder.newJob(SimpleJob.class);
        builder.withIdentity("test","test");
        builder.withDescription("my test");
        JobDetail jobDetail=builder.build();

3.建立一個Trigger,在這裏使用SimpleTrigger建立,從如今開始每隔1s執行一次。服務器

//建立一個調度規則,1s中運行一次,如今開始
        Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
                SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(1)
                        .repeatForever()).
                startNow().build();

4.建立一個Scheduler,而且把以上建立的Trigger和jobDetail註冊進去,而且開始執行併發

try {
            //獲取一個調度器
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            //註冊jobDetail,trigger到調度器
            scheduler.scheduleJob(jobDetail,trigger);
            //開始執行
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

基於Spring的例子

1.實現兩個Joboracle

public class MyJob {

    public void process(){
        System.out.println("處理Job.."+Thread.currentThread().getId());
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void process1(){
        System.out.println("處理Job1.."+Thread.currentThread().getId());
    }
}

配置spring框架

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

    <bean id="myJob" class="org.yywang.spring.MyJob"></bean>

    <bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="myJob"></ref>
        </property>
        <property name="targetMethod">
            <value>process</value>
        </property>
        <!-- 是否容許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->
        <property name="concurrent">
            <value>true</value>
        </property>

    </bean>

    <bean id="myJobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="myJob"></ref>
        </property>
        <property name="targetMethod">
            <value>process1</value>
        </property>
        <!-- 是否容許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->
        <property name="concurrent">
            <value>true</value>
        </property>

    </bean>

    <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="myJobDetail"></ref>
        </property>
        <property name="cronExpression">
            <value>0/2 * * * * ?</value>
        </property>
    </bean>

    <bean id="myTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="myJobDetail1"></ref>
        </property>
        <property name="cronExpression">
            <value>0/5 * * * * ?</value>
        </property>
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
               <ref bean="myTrigger"></ref>
                <ref bean="myTrigger1"></ref>
            </list>
        </property>
        <property name="autoStartup">
            <value>true</value>
        </property>
        <property name="configLocation" value="classpath:quartz.properties"/>
    </bean>
</beans>

quartz.propertieside

#============================================================================
# 配置 Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

#============================================================================
# 配置執行線程池
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

#============================================================================
# 配置 JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000

#內存中JobStore, 服務器重啓時執行記錄會丟失
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#數據庫中JobStore
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate

客戶端初始化spring便可ui

new ClassPathXmlApplicationContext("classpath:spring_*.xml");

Cron表達式

參考以下:
http://liuzidong.iteye.com/blog/1119773
http://www.iteye.com/topic/582119
http://blog.itpub.net/183473/viewspace-434672

Other以上須要的Maven配置

<properties>
        <org.springframework.version>3.2.3.RELEASE</org.springframework.version>
    </properties>

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

More

http://www.ibm.com/developerworks/cn/java/j-quartz/index.html
http://www.blogjava.net/baoyaer/articles/155645.html
http://www.blogjava.net/supercrsky/articles/199443.html

相關文章
相關標籤/搜索