Quartz定时任务框架使用流程和实战小项目源码/完整版

我们通过一个简单的Java Project项目来看一下,Quartz框架任务调度的使用流程。这里我们用Maven管理。

项目中用到的Jar包,直接通过Build Path导入即可。Jar包放在lib文件夹下面。如有需要,可以联系博主,提供项目源码
一共需要下面几个新增Jar包:
D:\quartz-2.2.3\lib\c3p0-0.9.1.1.jar
D:\quartz-2.2.3\lib\log4j-1.2.16.jar
D:\quartz-2.2.3\lib\quartz-2.2.3.jar
D:\quartz-2.2.3\lib\quartz-jobs-2.2.3.jar
D:\quartz-2.2.3\lib\slf4j-api-1.7.7.jar
D:\quartz-2.2.3\lib\slf4j-log4j12-1.7.7.jar
commons-logging-1.0.3.jar
Jar包也可以去Quartz官网下载,下载地址:http://www.quartz-scheduler.org/downloads/



1,其中的pom.xml文件内容如下:

<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.yangcq</groupId>  
    <artifactId>QuartzTest</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
    <packaging>jar</packaging>  
    
    <name>QuartzTest</name>  
    <url>http://maven.apache.org</url>  
    
    <properties>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    </properties>  
    
    <dependencies>  
        <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>  
        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.11</version>  
            <scope>test</scope>  
        </dependency>  
    </dependencies>  
</project>


2,然后定义一个我们自己的任务类 EBankJob,EBankJob实现Quartz框架的Job接口,重写
public void execute(JobExecutionContext context) throws JobExecutionException 方法,这个方法里面定义任务的具体内容。

package com.yangcq.quartz;
import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  
/**
 * 
 * @author yangcq
 * @description 需要jar包 quartz-1.6.6.jar 的支持
 * @since 实现Job接口
 *
 */
public class EBankJob implements Job {  
  /**
   * 在quartz里,我们具体要执行的任务就是通过实现接口Job来定义的。在这里的实现仅仅是打印一个字符串。
   * 定义好需要执行的任务之后,我们需要的是来定义任务执行的细节了。既然quartz是用来实现计划任务的功能,
   * 那么很多执行计划任务需要考虑到的东西就应该在这里定义了。比如说既然这个任务定义好了,
   * 它什么时候开始执行呢?需要执行一次还是多少次呢?每次执行的周期是多久呢?
   * 于是我们调用执行这个任务的代码实现如下:public class QuartzJobTest
   */
    public void execute(JobExecutionContext context) throws JobExecutionException{
        // 这里定义我们执行的定时任务的具体内容,比如订单处理完成以后,我们可以修改订单状态字段。
        System.out.println("定时任务开始执行...");  
        // 获取当前执行的定时任务的细节
        System.out.println("context.getJobDetail()=" + context.getJobDetail());
        // 获取当前执行的定时任务的名称
        System.out.println("context.getJobDetail().getKey()=" + context.getJobDetail().getKey());  
        // 获取当前执行的触发器的细节
        System.out.println("context.getTrigger() = " + context.getTrigger());  
        // 获取当前执行的触发器的名称
        System.out.println("context.getTrigger().getKey() = " + context.getTrigger().getKey());  
        // 获取当前执行定时任务的时间
        System.out.println("context.getScheduledFireTime() = " + context.getScheduledFireTime());  
    }  
    
    /**
     * Job接口源代码:
     * 
     * package org.quartz;
     *  public abstract interface Job
     *  {
     *    public abstract void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException;
     *  }
     */
}


</pre></p><p><span style="font-size:14px;">3,接下来我们写调度任务的实现细节,比如什么时间执行?执行周期? </span></p><p><span style="font-size:14px;"></span><pre name="code" class="java">package com.yangcq.quartz;
import org.quartz.CronScheduleBuilder;  
import org.quartz.JobBuilder;  
import org.quartz.JobDetail;  
import org.quartz.Scheduler;  
import org.quartz.SchedulerFactory;  
import org.quartz.Trigger;  
import org.quartz.TriggerBuilder;  
import org.quartz.impl.StdSchedulerFactory;
/**
 * 
 * @author yangcq
 * @description 简单的任务调度程序
 *
 */
public class QuartzJobTest{
  
  //Jar包冲突会报错:java.lang.IncompatibleClassChangeError: Implementing class
  
  // 定义定时任务的执行逻辑 cronExpression
  private final static String CRON_EXPRESSION = "0/20 * * * * ?";
  // 定义任务名称(自定义)
  private final static String JOB_NAME = "JOB_NAME";
  // 定义任务组名称
  private final static String GROUP_NAME = "GROUP_NAME";
  // 定义触发器名称
  private final static String TRIGGER_NAME = "TRIGGER_NAME";
  
  
    public static void main( String[] args ) throws Exception{  
        // 创建一个Scheduler对象,它用来真正调度和执行job
        SchedulerFactory sf = new StdSchedulerFactory();  
        Scheduler sched = sf.getScheduler();  
  
        // 注册我们定义的job 这里引用了我们前面定义的EBankJob.class
        JobDetail job = JobBuilder.newJob(EBankJob.class).withIdentity(JOB_NAME, GROUP_NAME).build();  
  
        // 定义触发这些任务的细节。这里的CronScheduleBuilder定义了该任务每20秒执行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TRIGGER_NAME, GROUP_NAME).withSchedule(CronScheduleBuilder.cronSchedule(CRON_EXPRESSION)).build();  
        sched.scheduleJob(job, trigger);  
        // 通过scheduler启动job
        sched.start();  
        Thread.sleep(60L * 1000L);  
        sched.shutdown(true);  
    }  
}  

项目运行结果:

log4j:WARN No appenders could be found for logger (org.quartz.impl.StdSchedulerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
定时任务开始执行...
context.getJobDetail()=JobDetail 'GROUP_NAME.JOB_NAME':  jobClass: 'com.yangcq.quartz.EBankJob concurrentExectionDisallowed: false persistJobDataAfterExecution: false isDurable: false requestsRecovers: false
context.getJobDetail().getKey()=GROUP_NAME.JOB_NAME
context.getTrigger() = Trigger 'GROUP_NAME.TRIGGER_NAME':  triggerClass: 'org.quartz.impl.triggers.CronTriggerImpl calendar: 'null' misfireInstruction: 0 nextFireTime: Sun Jul 24 09:52:40 GMT 2016
context.getTrigger().getKey() = GROUP_NAME.TRIGGER_NAME
context.getScheduledFireTime() = Sun Jul 24 09:52:30 GMT 2016


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值