Quartz定时器快速入门学习(一)

          

Quartz 基本概念及原理

    一.Quartz Scheduler 开源框架

       Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。读者可以到 http://www.quartz-scheduler.org/站点下载 Quartz 的发布版本及其源代码。笔者在产品开发中使用的是版本 1.8.4,因此本文内容基于该版本。本文不仅介绍如何应用 Quartz 进行开发,也对其内部实现原理作一定讲解。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.2.3。

    二.资源下载

  1. 官网:http://www.quartz-scheduler.org/

     

  1. 下载:http://www.quartz-scheduler.org/downloads

     

       3.marven配置

           把你的quartz-2.X.X引入到工程中,按如下配置:

           <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>  


三.核心组件


       (1)SchedulerFactory    -- 调度程序工厂

                 StdSchedulerFactory   -- Quartz默认的SchedulerFactory


       (2)Job是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中; 

       (3)JobDetailQuartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。 通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称; 

       (4)Trigger是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等; 

      (5)Calendar
org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。 

    

四.快速开始实现

   quarta实现定时任务通常有以下几种方式:

1.手工方式执行

    首先写一个类实现Job接口,然后实现接口中的execute()方法,这个类定义了定时器要做什么,即要执行的内容

   

package com.dfyc.zman.quartz;

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

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.impl.JobDetailImpl;

/**
 * 定义job【调度作业】
 * @author kevin
 * @ClassName HelloWorld
 * @version 1.0
 * @date 2017年5月22日下午2:46:40
 */
public class HelloWorld implements Job{

	@Override
	public void execute(JobExecutionContext jobexecutioncontext)
			throws JobExecutionException {
		SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(">>>>>>>>>>>>>>Hello World_"+sdf.format(new Date()));
	}

}


  定义了定时器做什么了,然后就需要定义按照一种什么方式(要制定的时间规则),

package com.dfyc.zman.quartz;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;


/**
 * Quartz本身提供了四种形式的Trigger实现,最常用的是SimpleTrigger和 CronTrigger,SimpleTrigger不能支持很复杂的调度,如果要实现在工作日做什么工作,
 * 休息日做什么工作等这样的调度,需要 CronTrigger来完成;
 * @author kevin
 * @ClassName QuartzTest
 * @version 1.0
 * @date 2017年5月22日下午3:11:01
 */
public class QuartzTest {

	public static void main(String[] args) throws SchedulerException, InterruptedException {
		// TODO Auto-generated method stub
		//通过工厂来创建scheduler对象
		Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
		//启动定时任务
		scheduler.start();
		long start = System.currentTimeMillis();
//		Thread.sleep(5000);
		//业务逻辑区
		JobDetail job = newJob(HelloWorld.class).withIdentity("job1", "group1").build();
		Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(simpleSchedule()
					      .withIntervalInSeconds(5).repeatForever()).build();---每隔5秒执行一次


	   scheduler.scheduleJob(job, trigger);
	   System.out.println(">>>>>>>>>>begin execute scheduleJob success......");


		//关闭定时任务
  		scheduler.shutdown();

	}

}

运行QuartzTest.java,可以看到如下日志,从日志可以看出程序每隔5秒输出一次Hello World的信息。

    这种方式的特点是Job,trigger自己手工编写,并通过Scheduler调度器来进行关联两者。



     

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值